开发工具与关键技术: Visual Studio / C++
作者:何文涛
撰写时间:2019-5-27
多继承是一个类有多个直接基类的继承关系,多继承可以说是单继承的扩展。多继承是指派生类有多个基类,派生类与每个基类之间的关系也看作是一个单继承。
多继承语句写法:
class 派生类名:访问语句 基类名A ,访问语句 基类名B …
{
数据成员和成员函数声明
};
一个简单的多继承:
class Ared{
};
class Bred{
};
class Cred :public Ared , public Bred{
};
以上就是一个多继承派生类Cred同时继承于Ared和Bred两个基类,
也就是有有多个父类。
多继承构造访问:
派生类构造函数执行顺序是先执行所继承基类的构造函数,再执行派生类本身构造函数,处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的各基类顺序。
构造对象的规则需要扩展以控制多重继承。构造函数按下列顺序被调用。
任何 虚拟基类的构造函数按照它们被继承的顺序构造。
任何非虚拟基类的构造函数按照它们被继承的顺序构造。
任何成员对象的构造函数按照它们声明的顺序调用。
类自己的构造函数。
虚基类:
如果一个派生类从多个基类派生而且刚好有这些基类刚好又有共同的一个基类,要是只是通过名字进行访问的话,就有可能产生二义性,当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例,要只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。
定义虚基类方法:在继承的类前面添加virtual限定符。
下面就举了个例子:
如图所示
图中定义了四个类,Sred,Ared,Bred和Cred其中,派生类类Cred直接多继承了了
类Ared和类Bred,而这两个类又继承了一个父类,所以第一个基类被继承了两次,这
里直接使用类对象访问的话就会出现二义性。
Main函数主方法:
void main()
{
Cred C;
C.S;
}
这里定义了类Cred一个对象,通过类对象来访问成员S,这里是不能被访问的
因为系统不知道你要访问的是哪个类里面的成员S。
要消除这个二义性就可以用虚基类来解决
类Sred只有一个成员变量,由于该子类被定义为虚基类,所以继承下来的成员S被约束了
无论使用不同的路径来访问S都是那唯一的对象,所以就不存在二义性了