Как видно, D3
представляет новую виртуальную функцию @function3()
в середине цепочки наследования. Мне интересно, что происходит с *--vptr и vtable, когда это происходит. D3 теперь является своего рода новым базовым классом,
class Base {
public:
virtual void function1() { std::cout << "Base func1()\n"; };
virtual void function2() { std::cout << "Base func2()\n"; };
};
class D1 : public Base {
public:
virtual void function2() { std::cout << "D1 func2()\n"; };
};
class D2 : public D1 {
public:
virtual void function1() { std::cout << "D2 func1()\n"; };
};
class D3 : public D2 {
public:
virtual void function2() { std::cout << "D3 func2()\n"; };
virtual void function3() { std::cout << "D3 func3()\n"; };
};
class D4 : public D3 {
public:
virtual void function1() { std::cout << "D4 func1()\n"; };
virtual void function3() { std::cout << "D4 func3()\n"; };
};
int main() {
D3 d3;
}
но когда я вижу записи vtable, я вижу function1()
, function2()
. Я думал, записи должны быть function2()
, function3()
. Почему я не могу получить то, что я думал?
Base
содержит только две записи. Будет дополнительная запись дляfunction3
, которая не отображается (или может быть ниже нижней части окна; проверьте полосу прокрутки). - person 1201ProgramAlarm   schedule 12.08.2019virtual
она становится виртуальной во всех производных классах (но также см.final
< /а>). Для вас это означает, что вам не нужно постоянно повторятьvirtual
. - person user4581301   schedule 12.08.2019final
, определенный в исходном файле. - person Jesper Juhl   schedule 13.08.2019final
. Таким образом, любые функцииvirtual
, очевидно, не могут быть переопределены. Таким образом, компилятору не нужно учитывать виртуальную диспетчеризацию. - person Jesper Juhl   schedule 13.08.2019