纯虚类与虚函数表
有这么个问题:
我们知道C++中有虚函数的类会有一个对应的虚函数表,那么纯虚类有虚表吗,如果有的话怎么调用纯虚函数?
直觉上来讲,应该是有的。 可是既然是纯虚类,说明其对象永远不会被创建,那么维护个虚表貌似也不是很必要了。
可以设计个程序来验证一下:
class VirtualBase
{
public:
VirtualBase()
{
// call pure virtual function through a non virtual function in base class's constructor
non_virtual_fun();
}
void non_virtual_fun()
{
virtual_fun();
}
virtual void virtual_fun() = 0;
};
class Derived: public VirtualBase
{
public:
virtual void virtual_fun(){}
};
int main(int argc, const char* argv[])
{
size_t size = sizeof(VirtualBase);
Derived d;
}
- sizeof(VirtualBase)返回4,而不是代表空类的1,这说明其内部是有一个虚表指针,而有虚表指针,那么极有可能有一个虚表。
- 通过上面的程序,我们在实例化Derived时可以调入VirtualBase的构造函数,此时可以在watch窗口中查看this指针,的确有一个虚表指针指向一个虚表
- 在构造函数中通过一个非虚函数调用一个纯虚函数 - 虽然该纯虚函数在Derived中被实现,但此时还在基类的构造函数中,所以,纯虚函数被调用 - 出错
纯虚类需要虚表,我能想到的一个原因是在多个派生类中override时,我们需要保证被改写的函数是在正确的偏移地址的,为了保证这个地址是正确的,事先准备一个模板还是比较重要的