говорится, что переопределение виртуальной функции не наследует аргументы по умолчанию, а вот вызов - наоборот, наследует аргументы по умолчанию в объявлении виртуальной функции.
[dcl.fct.default] пункт 10:
A virtual function call (11.7.2) uses the default arguments in the declaration of the virtual function determined by the static type of the pointer or reference denoting the object. An overriding function in a derived class does not acquire default arguments from the function it overrides.
struct Base {
virtual void f( int a = 7 ) {
std::cout << "Base::f() with a = " << a << '\n';
}
};
struct Derived : Base {
void f( int a ) {
std::cout << "Derived::f() with a = " << a << '\n';
}
};
Derived* pd = new Derived;
Base* pb = pd;
pb->f(); // здесь получим Derived::f() with a = 7
Во время инициализации vtable просто происходит заполнение всех офсетов, указателей на typeinfo и адресов соответствующих методов. И вот тут я не понимаю следующее - компилятор сам куда-то заносит эту информацию связанную с аргументом по умолчанию? или хранит в аргументах переопределенных методов, если так - тогда почему вызов pd->f(); без аргументов приводит к ошибке связанной с неправильной числом переданных аргументов?
Никаких втейбл в стандарте нет
это и так ясно, есть примерное представление как все это под капотом устроено, меня это и интересует, но относительно аргумента по умолчанию. Может кто читал про это в реализации компиляторов и т.д.
Компилятор просто подставит дефолтное значение если ты его не указал, это ортогонально виртуальным функциям
Обсуждают сегодня