__declspec(novtable)关键字

__declspec  ( novtable  )关键字,表示这个类不生成虚函数表,但是继承类不影响(不管基类是否使用了关键字)。
不使用此关键字,类在生成对象时构造函数和析构函数多要对这个虚函数表进行处理。
使用此关键字就相对省空间,少处理一些代码。

class  Base1
{
    virtual void f(){}
    virtual void g(){}
};
class    __declspec ( novtable  Base2
{
    virtual void f(){}
    virtual void g(){}
            void k(){}  //非虚函数
};

class     Derived : public Base1, public Base2
{
    virtual void f(){}
    virtual void h(){}
};
Base1 base1;
Base2 base2;
如下调试:

base1 中有虚函数表,base2中无虚函数表.
Base2 *pB2= &base2;
base2.g(); //成功
pB2->g(); // 指针通过虚函数表来访问,访问异常
pB2->k(); //成功调用非虚函数

Derived d;
第一个虚表地址: Derived ::f() Base1::g()  Derived ::h()
第二个虚表地址:Derived::f() Base::g()

在继承类中,同名虚函数覆盖,并合并到第一张虚函数表中。基类使用或者不使用关键字【 __declspec  ( novtable  )】,继承类生成的虚表多是一样的。


写本文前阅读参考了以下文章:
http://blog.sina.com.cn/s/blog_5d2118510100ftzt.html


你可能感兴趣的:(虚函数表,novtable)