__declspec(novtable) 应用

class __declspec(novtable) A

{

public:

A(){}

virtual void Fun1(){std::cout << "A::Fun1()" << "\n";}

virtual void Fun2(){std::cout << "A::Fun2()" << "\n";}

};

class __declspec(novtable) B : public A

{

public:

B(){}

virtual void Fun1(){std::cout << "B::Fun1()" << "\n";}

virtual void Fun3(){std::cout << "B::Fun3()" << "\n";}

virtual void Fun4(){

std::cout << "B::Fun4()" << "\n";

//Fun2();

}

};

class C : public B

{

public:

   C(){}

};


void MyFunc()

{

C c;         //由于 class C没有__declspec(novtable),VTable会创建成功

c.Fun1();    //调用 B::Fun1() ; 静态联编

c.Fun2();    //调用 A::Fun2() ;静态联编

B b;         //由于 class B有__declspec(novtable),VTable不会创建成功

A aa = b;

aa.Fun1();   //调用 A::Fun1();静态联编

b.Fun1();    //调用 B::Fun1();静态联编

b.Fun2();    //调用 A::Fun2();静态联编

b.Fun4();    //出错. 类的成员函数里调用虚函数需要 vtable指针,但是class B是不允许产生vtable指针的.

B* pb = new B();

//pb->Fun1();//出错Class B没有vtable指针; 动态联编

C* pc = new C;//由于 class C没有__declspec(novtable),VTable会创建成功; A,B,C 三个

            //class的Vtable and VPTR是同一个,即class的Vtale and VPtr

A*pa = pb;

pa = pc;     //动态联编

pa->Fun1();  //调用 B::Fun1() ; 动态联编

}


//结果

B::Fun1()

A::Fun2()

A::Fun1()

B::Fun1()

A::Fun2()

B::Fun4()

B::Fun1()

160354961.jpg

你可能感兴趣的:(declspec,novtable)