- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
#include <iostream>
class A
{
public:
virtual void print(int val = 10) { std::cout << "A" << val; }
};
class B : public A
{
public:
virtual void print(int val = 20) { std::cout << "B" << val; }
};
int main()
{
B b;
A& a = b;
a.print();
return 0;
}
Dummy00001 26.07.2016 00:50 # 0
Antervis 26.07.2016 05:51 # 0
Dummy00001 26.07.2016 11:20 # +1
у меня было как раз такая байда, когда 3rd party послало кастомером новую версию библиотеки и сказало что все пофиксили. когда стали разбиратся почему все стало еще хуже, выяснилось что они там дефолтные айди с 0 на -1 поменяли в нескольких местах - в дефолтах в хидерах. двоичной совместимости не меняется - сигнатуры методов/классов не поменялись. но все равно ни хера не работало потому что наша софтина была скомпилирована с хидерами с дефолтом 0, что компилер послушно и вставил в наш объектный код.
Soul_re@ver 26.07.2016 11:27 # 0
Dummy00001 26.07.2016 11:32 # 0
https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B
и к слову они упоминают:
"You can [...] change the default arguments of a method. It requires recompilation to use the actual new default argument values, though."
Antervis 26.07.2016 13:01 # 0
Dummy00001 26.07.2016 13:20 # +1
да даже если бы нам послали, то никто бы специального нового релиза/хот-фикса не делал, т.к. они сказали что ничего в интерфейсе не поменялось - только внутри самой библиотеки.
kurwa 26.07.2016 00:59 # +1
meinf 26.07.2016 15:43 # 0
https://ideone.com/KBn769
ожидаемое стандартное поведение
kurwa-nextgen 26.07.2016 16:07 # +1
Soul_re@ver 26.07.2016 16:15 # +1
kurwa-nextgen 26.07.2016 16:28 # +1
meinf 26.07.2016 17:39 # 0
тип объекта вычисляется в рантайме, конечно известно что будет вызван B::g(1488) ибо в данном случае 'x' не является интерфейсом
3_14dar 26.07.2016 22:07 # 0
Elvenfighter 26.07.2016 02:03 # 0
1024-- 26.07.2016 02:05 # +1
Elvenfighter 26.07.2016 02:11 # +5
1024-- 26.07.2016 09:39 # +1
Кстати, интересно, будет ли в C++ аналог virtual для значений по умолчанию.
Antervis 26.07.2016 05:53 # +7
th1s 26.07.2016 11:19 # 0
Значение аргументов по умолчанию - статически.
roman-kashitsyn 26.07.2016 21:54 # +2
Item 37: Never redefine a function's inherited default parameter value
NVI, вот это всё
bormand 26.07.2016 22:04 # 0
roman-kashitsyn 26.07.2016 22:09 # +4
Я обычно так и делаю.
Пишу две функции, прячу константы в .cpp-файле. Это гораздо надёжнее, особенно, если дефолты — объекты нетривиальных классов. Кмк, в жабе правильно их выпилили.
bormand 26.07.2016 22:45 # 0
Задолбали эти классы кишками наружу, из-за которых приходится делать pimpl или интерфейсы...
Soul_re@ver 26.07.2016 22:48 # 0
Dummy00001 27.07.2016 17:09 # 0
К слову. Какой эклипсов рефакторинг уже способен функцию между .h/.cc перемещать произвольно?
3_14dar 27.07.2016 22:58 # −2
Dummy00001 27.07.2016 23:33 # +1
roman-kashitsyn 27.07.2016 23:13 # −1
C-x C-v ?
Dummy00001 27.07.2016 23:38 # 0
В luna что у меня на бубунте стоит для этого ничего в refactoring меню не наблюдается.
В тяжелые времена я даже перлов скипт 2-5 строчник писал, которые из тела класса определения методов выдирал и в сырец записывал. Было не идеально, и надо было руками (ок, vim'ом) допиливать, но мне это было надо на 50+ методов и где-то на 10ом я уже затрахался это в ручную делать.
roman-kashitsyn 27.07.2016 23:58 # +1
Но ведь это связано с .h/.cpp файлами очень косвенно. Я в хедер-онли либах, к примеру, часто выношу тела методов за пределы класса, но они живут не в .cpp файле.
В общем, похоже на это
Dummy00001 28.07.2016 00:05 # 0
Antervis 27.07.2016 06:00 # 0
TEPAnEBT 26.07.2016 23:04 # −3
TEPAnEBT 26.07.2016 23:10 # −2
TEPAnEBT 26.07.2016 23:10 # −3