C ++の多重継承によってもたらされるあいまいさの問題の解決策

多重継承(ダイヤモンドまたはダイヤモンド継承)プログラミングは、多くの利便性をもたらし、生活に近づきますが、多くの問題ももたらします

#include<iostream>
using namespace std;

class B1
{
    
    
public:
	void output();
};

class B2
{
    
    
public:
	void output();
};
void B1::output()
{
    
    
	cout << "call the class B1" << endl;
}
void B2::output()
{
    
    
	cout << "call the class B2" << endl;
}

class A :public B1, public B2
{
    
    
public:
	void show();
};
void A::show()
{
    
    
	cout << "call the class A" << endl;
}


int main()
{
    
    
	A a;
	a.output();
	a.show();
}

ここに画像の説明を挿入します

プログラムはエラーを報告します。a.output()はB1またはB2を参照しますか?ここにはあいまいさがあります。

解決策1:ドメインメンバー演算子を使用します。欠点によりデータの冗長性がもたらされます

int main()
{
    
    
	A a;
	a.B1::output();
	a.show();
}

解決策2:仮想継承を使用する

#include<iostream>
using namespace std;

class B1
{
    
    
public:
	virtual void output() = 0;
	virtual int add(int a, int b) = 0;
};

class B2
{
    
    
public:
	virtual void output()=0;
	virtual int mult(int a, int b) = 0;
};


class A :public B1, public B2
{
    
    
public:
	virtual int add(int a, int b)
	{
    
    
		cout << "A: add() readly" << endl;
		return a + b;
	}
	virtual int mult(int a, int b)
	{
    
    
		cout << "A: mult() readly" << endl;
		return a * b;
	}
	virtual void output()
	{
    
    
		cout << "A output" << endl;

	}
};


int main()
{
    
    
	A a;
	int x, y;
	x = a.add(10, 20);
	y = a.mult(10, 20);
	cout << "x = " << x << "\ty = " << y << endl;
	a.output();

}

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_50188452/article/details/114363339
おすすめ