纯虚类与虚函数表

有这么个问题:

我们知道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时,我们需要保证被改写的函数是在正确的偏移地址的,为了保证这个地址是正确的,事先准备一个模板还是比较重要的

posted @ 2011-03-07 21:56  lzprgmr  阅读(3285)  评论(7编辑  收藏  举报

黄将军