C++ 虚继承对基类构造函数调用顺序的影响
作者:网络转载 发布时间:[ 2012/10/8 10:15:47 ] 推荐标签:
继承作为面向对象编程的一种基本特征,其使用频率非常高。而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。
首先,虚拟继承与普通继承的区别有:
假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;
假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr。(貌似有些牵强!某些编译器确实如此)
因此虚继承可以认为不是一种继承关系,而可以认为是一种组合的关系。正是因为这样的区别,下面我们针对虚拟继承来具体分析。虚拟继承中遇到广泛的是菱形结构。下面从菱形虚继承结构说起吧:
class stream
{
public:
stream(){cout<<"stream::stream()!"<<endl;}
};
class iistream:virtual stream
{
public:
iistream(){cout<<"istream::istream()!"<<endl;}
};
class oostream:virtual stream
{
public:
oostream(){cout<<"ostream::ostream()!"<<endl;}
};
class iiostream:public iistream,public oostream
{
public:
iiostream(){cout<<"iiostream::iiostream()!"<<endl;}
};
int main(int argc, const char * argv[])
{
iiostream oo;
};
程序运行的输出结果为:
stream::stream()!
istream::istream()!
ostream::ostream()!
iiostream::iiostream()!
输出这样的结果是毫无悬念的!本来虚拟继承的目的是当多重继承出现重复的基类时,其只保存一份基类。减少内存开销。其继承结构为:
stream
/
istream ostream
/
iiostream
这样子的菱形结构,使公共基类只产生一个拷贝。
从基类 stream 派生新类时,使用 virtual 将类stream说明为虚基类,这时派生类istream、ostream包含一个指向虚基类的vptr,而不会产生实际的stream空间。所以终iiostream也含有一个指向虚基类的vptr,调用stream中的成员方法时,通过vptr去调用,不会产生二义性。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11