複数の親を持つC++クラスがあります。各親は、共通の名前で異なる目的で関数を定義します。
class BaseA
{
virtual void myFunc(); // does some task
};
class BaseB
{
virtual void myFunc(); // does some other task
};
class Derived : public BaseA, public BaseB;
そうであれば、問題はありません。usingステートメントを使用してあいまいさを解決し、基本クラス名とスコープ解決演算子を使用してどちらを呼び出すかを選択できます。
残念ながら、派生クラスはそれらの両方をオーバーライドする必要があります。
class Derived : public BaseA, public BaseB
{
virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
virtual void BaseB::myFunc();
}
これは機能しません。これは、新しいあいまいさを導入するためではなく(可能性はありますが)、
"エラーC3240:'myFunc':'BaseA'のオーバーロードされていない抽象メンバー関数である必要があります"
「エラーC2838:メンバー宣言に不正な修飾名があります」
さまざまな状況下で、メソッドの名前を変更するか、コンパイラーが提案するようにメソッドを純粋な仮想にすることができます。ただし、クラス階層構造と多くの外部の問題により、最初のオプションは非常に難しく、2番目のオプションは不可能です。
誰か提案がありますか?修飾子が純粋仮想メソッドでのみ許可されるのはなぜですか?仮想メソッドをオーバーライドし、あいまいさを解決する方法はありますか?