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

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

  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;
}

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

猜你喜欢

转载自blog.csdn.net/flf1234567898/article/details/107896113