实际的业务场景中,一些事物会有多个属性。由此c++引入了,多重继承的概念,也就是允许一个派生类指定多个基类,这样就被叫做多重继承。
如下代码:
#include "stdafx.h"
#include <iostream>
#pragma warning(disable:4996)
#include <string>
using namespace std;
class car{
public:
car(){
cout << "this is car" << endl;
}
void print(void)
{
cout << "car class print" << endl;
}
};
class truck:public car
{
public:
truck(){
cout << "this is truck" << endl;
}
void truck_print(void){
cout << "truck::truck_print" << endl;
}
};
class bus:public car
{
public:
bus(){
cout << "this is bus" << endl;
}
void bus_print(void){
cout << "bus::bus_print" << endl;
}
};
class train :public truck, public bus{
public:
train(){
cout << "this is train" << endl;
}
void train_print(void){
cout << "train::train_print" << endl;
}
};
int main(int argc, char *argv[])
{
train test1;//多重继承的构造顺序和继承列表中基类的排列顺序一致,不是和它的初始化列表中的顺序
//一致,所以先执行truck中的构造函数,truck先执行car的构造函数。再执行bus中的构造函数,bus中先执行
//car中的构造函数
/*this is car
this is truck
this is car
this is bus
this is train*/
test1.train_print();//train::train_print
test1.truck_print();//truck::truck_print
test1.print();//出现二义性,print成员函数不明确。因为类bus和truck继承car的时候,都分别对
//car中的成员函数print做了一份拷贝。train在继承bus和truck时对bus和truck多了拷贝。所以
//test1.print()无法访问那个基类的print。
car *p_car = &test1;//同样会产生二义性,将上面的继承按照下面的方法二,改为虚继承即可。
return 0;
}
消除二义性的方法:
1.加上全局符指定使用哪一份拷贝。如:
test1.truck::print();
test1.bus::print();
2.使用虚继承,这样的话。派生类train只有一份基类car的拷贝了。如:
将上面的
class truck:public car
class bus:public car
改为:
class truck:virtual public car
class bus:virtual public car