哪个虚拟表将是纯虚函数?在基类或派生类中?
例如,每个类中的虚拟表是什么样的?
class Base {
virtual void f() =0;
virtual void g();
}
class Derived: public Base{
virtual void f();
virtual void g();
}
答案 0 :(得分:16)
g++ -fdump-class-hierarchy layout.cpp
生成文件layout.cpp.class
。 layout.cpp.class
的内容将显示以下内容:
Vtable for Base Base::_ZTV4Base: 4u entries 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI4Base) 16 __cxa_pure_virtual 24 Base::g Class Base size=8 align=8 base size=8 base align=8 Base (0x7ff893479af0) 0 nearly-empty vptr=((& Base::_ZTV4Base) + 16u) Vtable for Derived Derived::_ZTV7Derived: 4u entries 0 (int (*)(...))0 8 (int (*)(...))(& _ZTI7Derived) 16 Derived::f 24 Derived::g Class Derived size=8 align=8 base size=8 base align=8 Derived (0x7ff893479d90) 0 nearly-empty vptr=((& Derived::_ZTV7Derived) + 16u) Base (0x7ff893479e00) 0 nearly-empty primary-for Derived (0x7ff893479d90)
删除f
的'纯度'会将第五行更改为:
16 Base::f
答案 1 :(得分:2)
每个班级都有自己的vtable。 f
中Base
的条目为NULL
,Derived
中的条目将是指向已实施方法的代码的指针。
答案 2 :(得分:1)
vtable条目将在基类中。
为什么呢?因为您可以拥有一个基类指针类型,该类型包含派生类型对象的地址,并仍然在基类型的指针变量上调用该方法。
纯虚拟只是告诉编译器派生类型必须提供自己的实现,并且它们不能依赖基类的实现(如果甚至在基类中指定了一个)
答案 3 :(得分:1)
pure_virtual_function_called()
存根,而派生类vtable将具有指向实际实现的指针。