c++中多重继承二义性产生以及二义性的消除方法

实际的业务场景中,一些事物会有多个属性。由此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

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值