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()
转载于:https://blog.51cto.com/bagger/1333762