菱形虚拟继承&虚函数表&对象模型
菱形继承:
Assitant的菱形继承对象模型
Assitant中有两份Person成员,存在二义性和数据冗余。
所以我们引出了虚拟继承。
virtual虚继.不会在子类中创建父类成员,但是子类中可以引用,就像指针一样。主要用在菱形继承,也叫钻石继承。
虚拟继承对象模型
classStudent:vitrualpublicPersonclassTeacher:virtualpublicPeraon
虚函数表
通过一块连续内存来存储虚函数的地址。这张表解决了继承、虚函数(重写)的
问题。在有虚函数的对象实例中都存在一张虚函数表,虚函数表就像一张地图,指明了实
际应该调用的虚函数。
举例:
typedefvoid(*PFUN)();voidPrintVT(intp)//打印虚函数表的信息{PFUNpfun=NULL;int*ptr=(int*)p;cout<<"虚表地址->"<<ptr<<endl;inti=0;while(ptr[i]){pfun=(PFUN)ptr[i];cout<<"第"<<i<<"个虚函数地址-》"<<pfun<<"----";pfun();i++;}}
classB{public:virtualvoidfun1(){cout<<"B::fun1()"<<endl;}virtualvoidfun2(){cout<<"B::fun2()"<<endl;}private:int_b;};classD:publicB{public:virtualvoidfun1(){cout<<"D::fun1()"<<endl;}virtualvoidfun3(){cout<<"D::fun3()"<<endl;}virtualvoidfun4(){cout<<"D::fun4()"<<endl;}private:int_d;};intmain(){Dd;Bb;PrintVT(*(int*)&d);cout<<endl;PrintVT(*(int*)&b);getchar();return0;}
其结果如下:
这就是我们所说的虚函数。因为在D里重写的B::fun1();所以D中的fun1()就被覆盖了。小伙伴们懂了吗?
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。