C++ 虚继承对基类构造函数调用顺序的影响-1
上一篇 / 下一篇 2012-10-09 10:43:38 / 个人分类:C++
%Q^W!Ay8}p0 继承作为面向对象编程的一种基本特征,其使用频率非常高。而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。
+O6h g(n0['vx [{eI051Testing软件测试网,Sj|3Y vqWtt*I首先,虚拟继承与普通继承的区别有:
z#u]n0Dh:W5z0F9[6^:IKF?0 假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;
2OO%nrA bBK,HUa0:RG[/B ULT0 假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr。(貌似有些牵强!某些编译器确实如此)51Testing软件测试网F&M5q3ohbF+jd+\G
,P]$w5kbg6`U1T x0 因此虚继承可以认为不是一种继承关系,而可以认为是一种组合的关系。正是因为这样的区别,下面我们针对虚拟继承来具体分析。虚拟继承中遇到最广泛的是菱形结构。下面从菱形虚继承结构说起吧:51Testing软件测试网5W Zsm0n?1y
1t5`W%Zz#vo0class stream51Testing软件测试网4e$?{3a-~hYs @#d+W"lNLr:A1BP6U;xj0class iistream:virtual stream51Testing软件测试网%o+\%WQhpDFC-L J.]c-T]A
u,f0class oostream:virtual stream n Ze/C-xp2m0class iiostream:public iistream,public oostream int main(int argc, const char * argv[]) |
-ro"LG&P iN-g0 程序运行的输出结果为:
|:|Mju#N051Testing软件测试网f,wo9Kl8u@u stream::stream()!
KBddKP0 istream::istream()!51Testing软件测试网s^Po0\WM T
ostream::ostream()!
2@/ArJ&e\1_|
U0 iiostream::iiostream()!
.Ct$v{L5t|b0 输出这样的结果是毫无悬念的!本来虚拟继承的目的就是当多重继承出现重复的基类时,其只保存一份基类。减少内存开销。其继承结构为:
7|-[4U)odP C0G0M!G7k'M?d`.jJ0 stream
DA)V(sV8T{ol
H0 / \
-J#kPV EW0 istream ostream
I7x0moo[0 \ /
/}'zeG%MyXB0 iiostream
这样子的菱形结构,使公共基类只产生一个拷贝。51Testing软件测试网&p2{c`.K;Kb!Mw