} 结果:Base11 Base24 Base33 Default Base3 Base22 Base12 Derived Derived 析构 Base1 析构 Base2 析构 Base3 析构 Base3 析构 Base2 析构 Base1 析构 请按任意键继续. . .4. 以上是对于单继承的描述,如果是多继承,那么常规的话,我们很容易清楚器执行顺序,但是如果是虚继承,其执行顺序又会如何 ?1. 现在我们来看这样一个图:它的运行结果又是如何.......#include<iostream> using namespace std;class Boss {public : Boss() { cout << "this is Boss"s constructor !" << endl; }; Boss(int i) { cout << "this is Boss"s constructor !" << " moneny=" << i << endl; } void show() { cout<<"宝剑磨砺,斩魂妖,时光磨砂,魔刃出"<<endl; } virtual ~ Boss() { cout << "this is Boss"s xigou function !" << endl; }; //虚析构函数 };//店小二 class xiao_er :virtual public Boss { public: xiao_er() { cout << "this is xiao_er"s constructor !"<<endl; } xiao_er(int i) : Boss(i){ cout << "this is xiao_er"s constructor !" << " moneny=" << i << endl; } virtual ~xiao_er() { cout << "this is xiao_er"s xigou function !" << endl; } void show() { cout << "我是店小二,客官 !" << endl; } };//王二小 class er_xiao : virtual public Boss , virtual public xiao_er /*其实这里这个可以省去,但是这儿是为了写代码而写代码*/ { public : er_xiao() { cout << "this is er_xiao"s constructor !" << endl; } er_xiao(int i) : Boss(i) , xiao_er(i+1) { cout << "this is er_xiao"s constructor !" << " moneny=" << i << endl; } virtual ~ er_xiao() { cout << "this is er_xiao"s xigou function !"<<endl; } void show() { cout << "我是王二小,为坏人带路的王二小 !" << endl; } };//天朝VIP员工 class VIP_em : virtual public Boss {public: VIP_em(){ cout << "this is VIP_em"s constructor !" << endl; } VIP_em(int i) : Boss(i) { cout << "this is VIP_em"s constructor !" << " moneny=" << i << endl; } virtual ~VIP_em() { cout << "this is VIP_em"s xigou function !" << endl; } void show() { cout << "我是VIP , 我有特权! "<<endl; } };//熊孩子 class stupid_kid : virtual public VIP_em , virtual public xiao_er , virtual public er_xiao { public: stupid_kid() { cout << "this is stupid_kid"s constructor !" << endl; } stupid_kid(int i) : VIP_em(i) , xiao_er(12) , er_xiao(13),xe(i) { cout << "this is stupid_kid"s constructor !" <<" moneny="<<i<<endl; } ~stupid_kid() { cout << "this is stupid_kid"s xigou function !"<<endl; } void show() { cout << "我是熊孩子,蜀黍,蜀黍,抱抱!" << endl; } private : VIP_em vi; xiao_er xe; er_xiao ex; };int main(){ stupid_kid st(100); //父类的函数被覆盖了 st.show(); //如何调用父类,强制是一种。 ((Boss)st).show();
//stupid_kid *pt = &st; //stupid_kid &sb = st; // pt->show(); //((Boss)sb).show(); return 0; } 结果为:this is Boss"s constructor ! this is VIP_em"s constructor ! moneny=100 this is xiao_er"s constructor ! moneny=12 this is er_xiao"s constructor ! moneny=13 -------------这部分为熊孩子的继承部分构造函数下面是私有变量的构造函数this is Boss"s constructor ! this is VIP_em"s constructor ! ------私有变量 Vip_em调用无参数的构造函数 this is Boss"s constructor ! moneny=100 this is xiao_er"s constructor ! moneny=100 ------私有变量 xiao_er调用有参数的构造函数this is Boss"s constructor ! this is xiao_er"s constructor ! ------私有变量 xiao_er调用无参数的构造函数 this is er_xiao"s constructor !this is stupid_kid"s constructor ! moneny=100 我是熊孩子,蜀黍,蜀黍,抱抱! 宝剑磨砺,斩魂妖,时光磨砂,魔刃出 this is Boss"s xigou function ! this is stupid_kid"s xigou function ! this is er_xiao"s xigou function ! this is xiao_er"s xigou function ! this is Boss"s xigou function ! this is xiao_er"s xigou function ! this is Boss"s xigou function ! this is VIP_em"s xigou function ! this is Boss"s xigou function ! this is er_xiao"s xigou function ! this is xiao_er"s xigou function ! this is VIP_em"s xigou function ! this is Boss"s xigou function ! 请按任意键继续. . .6、 从上述代码可以不难看出, 虚内继承,避免了二义性,仅仅压缩了公有的你虚类继承类。如果要弄清楚虚拟继承,就得先知道virtual table (vtbl) ----我们说的虚函数表在内存那块, 会留 下一块连续的内存块,用作vtble存储JMP地址,而vtble里头存的便是virtual function(虚函数)地址,每次继承时,基类都会产生一个vptr指针,指向派生类的地质,当 vptr指针指着同一个地址时,就不重复构造。 其他的,构造函数和析构函数,基于第一个代码列子。 根据自己对源码的理解和测试的总结,如有错误,还请多多指正。编程是一种快乐,享受代码带给我的乐趣!!!本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-03/115326.htm