多层继承当中构造函数对虚函数表指针的初始化

来源:互联网 发布:无翼鸟漫画下载软件 编辑:程序博客网 时间:2024/04/30 10:58

#include <iostream>using namespace std;/*  三个空类,A为基类,B继承A,C继承B;   每个类都有自己的独立的虚函数表,只不过A的虚函数表里只有show()的地址  B的有两项(show和show2), C的有三项(show,show2,show3)。  三个类的sizeof都是4, 它存的是指向虚函数表的指针(vptr)  可以用 *(unsigned int *)this 获得它里边存的虚函数表的地址。 */class A{public:A(){//执行这句之前,虚函数表指针指向类A的虚函数表cout<<"vptr="<<hex<< *(unsigned int*)this<<endl;}virtual void show(){}};class B : public A{public:B(){//1.先调用基类的构造函数,vptr指向类A的虚函数表; //2.调用类B的构造,vptr指向类B的虚函数表cout<<"vptr="<<hex<< *(unsigned int*)this<<endl;}virtual void show2(){}};class C: public B {public:C(){//1. 调用类A的构造,vptr指向类A的虚函数表//2. 调用类B的构造,vptr指向类B的虚函数表//3. 调用类C的构造,vptr指向类C的虚函数表cout<<"vptr="<<hex<< *(unsigned int*)this<<endl;}virtual void show3(){}};int main(int argc,char* argv[]){cout<<"-------------------------------"<<endl;A a;cout<<"-------------------------------"<<endl;B b;cout<<"-------------------------------"<<endl;C c;return 0;}

执行结果如下,a变量的vptr初始化了一次,c变量的vptr初始化了3次,效率较低。


原创粉丝点击