多继承二义性

#include "stdafx.h"

//
//****************多继承、虚继承*****************//二义性
//
//类CBase
class CBase
{
public:
	CBase() :base(10) 
	{
	};
	~CBase()         
	{
	};

	void fun()
	{
		std::cout << "CBase:a " << base << endl;
	}
public:
	int base;
};

//类CChildA
class CChildA: virtual public CBase
{
public:
	CChildA():a(11) 
	{
	};
	~CChildA()       
	{
	};

	void fun()
	{
		std::cout << "CChildA:base " << base << endl;
		std::cout << "CChildA:a " << base << endl;
	}
public:
	int a;
};

//类CChildB
class CChildB: virtual public CBase
{
public:
	CChildB():b(12) 
	{
	};
	~CChildB()      
	{
	};

	void fun()
	{
		std::cout << "CChildB:base " << base << endl;
		std::cout << "CChildB:b " << b << endl;
	}
public:
	int b;
};

//类CChildC,产生二义性
class CChildC:public CChildA, public CChildB
{
public:
	CChildC() :c(13),base(12)
	{
	};
	~CChildC()     
	{
	};

	void fun()
	{
		std::cout << "CChildC:base " << /*CBase::*/base << endl;        //二义性位置,解决:1、类限定 CChildA::base 2、A、B继承加虚virtual解决(只有一份数据)
		std::cout << "CChildC:a " << a << endl;
		std::cout << "CChildC:b " << b << endl;
		std::cout << "CChildC:c " << c << endl;
	}
public:
	int c;
	int base;                                                           //虚继承在内存中保留一份成员数据,子类同名不会覆盖,多一份数据,输出时不加限定会输出子类同名数据
};
//
//****************run函数:测试本文件内功能****************//
//
static void run()
{
	CChildC Child;
	Child.fun();                                                        //如果不是虚继承,会产生二义性,编译不会通过,成员数据和函数(包括虚函数)是一样的;产生二义性的地方,编译器都不会通过
}

int main()
{
	run();
	system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值