- 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;
}
у меня было как раз такая байда, когда 3rd party послало кастомером новую версию библиотеки и сказало что все пофиксили. когда стали разбиратся почему все стало еще хуже, выяснилось что они там дефолтные айди с 0 на -1 поменяли в нескольких местах - в дефолтах в хидерах. двоичной совместимости не меняется - сигнатуры методов/классов не поменялись. но все равно ни хера не работало потому что наша софтина была скомпилирована с хидерами с дефолтом 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."
да даже если бы нам послали, то никто бы специального нового релиза/хот-фикса не делал, т.к. они сказали что ничего в интерфейсе не поменялось - только внутри самой библиотеки.
https://ideone.com/KBn769
ожидаемое стандартное поведение
тип объекта вычисляется в рантайме, конечно известно что будет вызван B::g(1488) ибо в данном случае 'x' не является интерфейсом
Кстати, интересно, будет ли в C++ аналог virtual для значений по умолчанию.
Значение аргументов по умолчанию - статически.
Item 37: Never redefine a function's inherited default parameter value
NVI, вот это всё
Я обычно так и делаю.
Пишу две функции, прячу константы в .cpp-файле. Это гораздо надёжнее, особенно, если дефолты — объекты нетривиальных классов. Кмк, в жабе правильно их выпилили.
Задолбали эти классы кишками наружу, из-за которых приходится делать pimpl или интерфейсы...
К слову. Какой эклипсов рефакторинг уже способен функцию между .h/.cc перемещать произвольно?
C-x C-v ?
В luna что у меня на бубунте стоит для этого ничего в refactoring меню не наблюдается.
В тяжелые времена я даже перлов скипт 2-5 строчник писал, которые из тела класса определения методов выдирал и в сырец записывал. Было не идеально, и надо было руками (ок, vim'ом) допиливать, но мне это было надо на 50+ методов и где-то на 10ом я уже затрахался это в ручную делать.
Но ведь это связано с .h/.cpp файлами очень косвенно. Я в хедер-онли либах, к примеру, часто выношу тела методов за пределы класса, но они живут не в .cpp файле.
В общем, похоже на это