C++继承与派生(原理归纳)(二)

2015-07-20 17:09:17 ? 作者: ? 浏览: 8
?85 };
?86?
?87 //熊孩子
?88 class stupid_kid : virtual public V
? ?, virtual public xiao_er , \
?90 ? ? virtual public er_xiao
?91 {
?92 ?public:
?93 ? ? ?stupid_kid() {
?94 ? ? ? ? ?cout << "this is stupid_kid's constructor !" << endl;
?95 ? ? ?}
?96?
?97 ? ? ?stupid_kid(int i) : \
?98 ? ? ? ? ?VIP_em(i) , xiao_er(12) , er_xiao(13),xe(i)
?99 ? ? ?{
100 ? ? ? ? ?cout << "this is stupid_kid's constructor !" \
101 ? ? ? ? ? ? <<" moneny="<
102 ? ? ?}
103 ? ? ?~stupid_kid() {
104 ? ? ? ?cout << "this is stupid_kid's xigou function !"<
105 ? ? ?}
106?
107 ? ? ?void show() {
108 ? ? ? ? ?cout << "我是熊孩子,蜀黍,蜀黍,抱抱!" << endl;
109 ? ? ?}
110 private :
111 ? ? VIP_em vi;
112 ? ? xiao_er xe;
113 ? ? er_xiao ex;
114 };
115?
116 int main(){
117?
118 ? ? stupid_kid ?st(100);
119 ? ? //父类的函数被覆盖了
120 ? ? ?st.show();
121 ? ? //如何调用父类,强制是一种。
122 ? ? ?((Boss)st).show();
123 ? ??
124 ? ? //stupid_kid *pt = &st;
125 ? ? //stupid_kid ?&sb = st;
126 ? ? // pt->show();
127 ? ? //((Boss)sb).show();
128 ? ? return 0;
129 }
?
结果为:
?
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指针指着同一个地址时,就不重复构造。 其他的,构造函数和析构函数,基于第一个代码列子。 ?根据自己对 源码的理解和测试的总结,如有错误,还请多多指正。
?
?
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: