NoneVptr и vtable наследуются от базового класса?
Как можно заметить, 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()
, Почему я не могу получить то, что думал?
2 ответа
Vtable содержит все унаследованные виртуальные функции и все недавно представленные.
Вот таблица для D3, сгенерированная MSVC:
const D3::`vftable' DD FLAT:const D3::`RTTI Complete Object Locator' ; D3::`vftable'
DD FLAT:virtual void D2::function1(void)
DD FLAT:virtual void D3::function2(void)
DD FLAT:virtual void D3::function3(void)
Причиной, по которой отладчик не показывает их все, может быть ошибка или ограничение.
Непонятно, что вы подразумеваете под "что происходит". Все vtable
s являются специфическими для класса (типа). vtable
за D1
отличается от vtable для D2
, и так далее.
Vtable для D3
имеет больше функций, чем D1
один. Вы можете обычно вызывать эти функции, если ваш статический тип D3
или же D4
, но не может вызвать их, если ваш статический тип D1
или же D2
,