多重継承(ダイヤモンドまたはダイヤモンド継承)プログラミングは、多くの利便性をもたらし、生活に近づきますが、多くの問題ももたらします
#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();
}