C++中的虚继承
来源:互联网 发布:股票行情软件源码 编辑:程序博客网 时间:2024/04/29 09:35
多继承中被当做基类来虚继承的类是虚基类。
虚基类:使用关键字virtual继承的基类。即使同一类在层次中作为虚基类出现多次,派生类对象中虚基类部分也只出现一次。在非虚基类中,构造函数只能初始化自己的直接基类,当对一个类进行虚继承的时候,由最底层的派生类初始化那个类,因此最底层的派生类应包含用于其他所有虚父类的初始化式。
在这里有四个类:Point ,PointA,PointB,DerivedPoint。我给出头文件,不用给出源文件了:
- class Point
- {
- public:
- Point();
- virtual ~Point();
- int x,y;
- };
- #include"Point.h"
- class PointA :public virtual Point
- {
- public:
- PointA();
- virtual ~PointA();
- int a;
- };
- #include"Point.h"
- class PointB :public virtual Point
- {
- public:
- PointB();
- virtual ~PointB();
- int b;
- };
- #include"PointA.h"
- #include"PointB.h"
- class DerivedPoint :public PointA,public PointB
- {
- public:
- DerivedPoint();
- virtual ~DerivedPoint();
- int d;
- };
PointA和PointB虚继承Point,DerivedPoint继承自PointA与PointB。
假定通过多个派生路径继承名为X的成员,有下面三种可能性:
1.如果在每个路径中X表示同一个虚基类成员,则没有二义性,因为共享该成员的单个实例。
2.如果在某个路径中X为虚基类成员,而在另一路径中X是后代派生类成员,也没有二义性------特定派生类实例的优先级高于共享虚基类实例。
3.如果沿每个继承路径X表示后代派生类的不同成员,则该成员的直接访问是二义性的。
特殊的初始化语意
从具有虚基类的类继承的类对初始化进行了特殊的处理。在虚派生中由最底层派生类的构造函数初始化虚基类
虽然由最底层派生类初始化虚基类,但是任何直接或者间接继承虚基类的类一般也必须为该基类提供自己的初始化式。只要可以创建虚基类派生类类型的对象,该类就必须初始化自己的虚基类部分,这些初始化式只在创建中间类型对象时使用。
有了以上的规则,我的类就应该如下写:
- class Point
- {
- public:
- Point();
- Point(int x,int y){this->x=x;this->y=y;};
- virtual ~Point();
- int x,y;
- };
- #include"Point.h"
- class PointA :public virtual Point
- {
- public:
- PointA();
- PointA(int x,int y,int a):Point(x,y),a(a)
- {};
- virtual ~PointA();
- int a;
- };
- #include"Point.h"
- class PointB :public virtual Point
- {
- public:
- PointB();
- PointB(int x,int y,int b):Point(x,y){this->b=b;};
- virtual ~PointB();
- int b;
- };
- #include"PointA.h"
- #include"PointB.h"
- class DerivedPoint :public PointA,public PointB
- {
- public:
- DerivedPoint();
- DerivedPoint(int x,int y,int a,int b,int d):PointA(x,y,a),PointB(x,y,b),Point(x,y),d(d){};
- virtual ~DerivedPoint();
- int d;
- };
在主函数中调用如下:
- #include<iostream>
- #include "DerivedPoint.h"
- using namespace std;
- void main()
- {
- DerivedPoint pt(1,2,3,4,5);
- cout<<pt.x<<pt.y<<pt.a<<pt.b<<pt.d<<endl;
- }
打印结果正常。
在这里首先构造虚基类,再构造PointA,PointB,DerivedPoint。在PointA和PointB中构造虚基类的调用被忽略。如果在DrivedPoint的构造函数中不显示调用Point的构造函数,就调用Point的默认构造函数,如果Point没有默认的构造函数,代码出错。
注意:虚基类的构造函数一定是最先调用
- 【C++】c++中的继承
- 浅谈Objective-C中的继承
- 【C++】浅谈C++中的继承
- 【C++】浅析C++中的继承
- 菱形继承中的虚继承
- 【C++】虚函数在不同继承方式中的对象模型
- C++中的虚继承
- C++中的虚继承
- C++ 中的虚继承
- C++中的虚继承
- C++中的虚继承
- C++-虚继承
- 【C++】:C++中的继承权限和继承方式
- 初识c#---继承和继承关系中的构造函数
- C中的继承和多态
- C#中的接口和继承多态
- C中的继承与多态
- Objective-C中的继承和重载
- #LeetCode 3Sum
- Resharper的快捷键
- ShareSDK分享遇到的问题及解决方法
- 关于QscrollArea的使用
- Android shell相关的Bat文件执行
- C++中的虚继承
- Windows安装和使用zookeeper
- linux shell 管道命令(pipe)使用及与shell重定向区别
- 最终还是放弃了使用微博秀工具
- 搭建Android4.0工作环境-ubuntu 服务器搭建全纪录
- "ld: library not found for -l...." 问题的解决
- vc显示jpg,gif图像简单方法
- QT中QToolBox的使用,实现抽屉效果
- C++派生类与基类的转换