菱形继承与虚基类解决菱形继承问题

在多重继承中存在二义性问题
我们来看第一类二义性问题:

  1. 派生类函数与基类函数重名问题:
class Fa
{
private:
	int m;
public:
	void print()
	{
		cout << "aaa" << endl;	
	}
};
class Stu1 :public Fa
{
public:
	void print()
	{
		cout << "sss" << endl;
	}
};
int main()
{
	Stu1 s;
	s.print();
	return 0;
}

这个会导致程序阅读者造成歧义,但是本身程序迷人调用的是派生类的print()函数。
解决方法:
加上作用域解析符号

Stu1 s;
	s.Fa::print();

2:菱形继承带来的歧义性问题

在这里插入图片描述
如果程序出现了这种,B,C继承了A,D继承了B,C这种问题,如果通过D我们调用A里面的成员函数,到底是通过路径A还是路径B呢?
这就造成了歧义

class A
{
public:
	void fun()
	{
		cout << "A" << endl;
	}
};

class B : public A
{
public:
	void funb()
	{
		cout << "B" << endl;
	}
};

class C :public A
{
	void func()
	{
		cout << "C" << endl;
	}
};
class D:public B,public C
{
public:
	void fund()
	{
		cout << "D" << endl;
	}
};

int main()
{
	D d;
	d.fun();

	system("pause");
	return 0;
}

在这里插入图片描述
解决方案1:
加上作用域解析符:

D d;
	d.C:: fun();
	d.B::fun();

方法2:虚基类

C++中为了允许程序中只有公共基类的一个副本,使得基类不产生多次拷贝,写入了虚基类。


class A
{
public:
	void fun()
	{
		cout << "A" << endl;
	}
};

class B : virtual public A
{
public:
	void funb()
	{
		cout << "B" << endl;
	}
};

class C :virtual public A
{
	void func()
	{
		cout << "C" << endl;
	}
};
class D:public B,public C
{
public:
	void fund()
	{
		cout << "D" << endl;
	}
};

int main()
{
	D d;
	d.fun();
	d.C:: fun();
	d.B::fun();
	system("pause");
	return 0;
}

这样就能解决二义性问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值