のインターフェイスの多重継承に、私は次のようにテストコードを作った:私はこのコードを書いた理由は、関数funcBase()はDDerivedのインスタンスで呼び出すことができるかどうかをテストすることである曖昧はC++
#include <iostream>
using namespace std;
#ifndef interface
#define interface struct
#endif
interface Base
{
virtual void funcBase() = 0;
};
interface Derived1 : public Base
{
virtual void funcDerived1() = 0;
};
interface Derived2 : public Base
{
virtual void funcDerived2() = 0;
};
interface DDerived : public Derived1, public Derived2
{
virtual void funcDDerived() = 0;
};
class Implementation : public DDerived
{
public:
void funcBase() { cout << "base" << endl; }
void funcDerived1() { cout << "derived1" << endl; }
void funcDerived2() { cout << "derived2" << endl; }
void funcDDerived() { cout << "dderived" << endl; }
};
int main()
{
DDerived *pObject = new Implementation;
pObject->funcBase();
return 0;
}
又はない。このコードをコンパイルしようとすると、私のC++コンパイラ(Visual Studio 2010)からコンパイルエラーメッセージが表示されました。私の意見では、このコードには問題はありません。なぜなら、それは純粋な仮想であるため、DDerived
インターフェイスの一部の派生クラスでは、関数funcBase()
が実装されている(オーバーライドされている)からです。換言すれば、タイプImplementation *
のポインタ変数は、Implentationを導出し、関数funcBase()
を無効にするクラスのインスタンスに関連付けられるべきである。
私の質問は、なぜコンパイラが私にそのようなエラーメッセージを与えるのですか?なぜC++構文がそのように定義されているのですか?すなわち、この場合をエラーとして扱うか?コードを実行するにはどうすればよいですか?私はインターフェイスの複数の継承を許可したい。私は
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
ようImplementation
に「仮想public」または再宣言する機能funcBase()
を使用する場合はもちろん、その後、すべてが問題なく動作します。
しかし、仮想継承はパフォーマンスを低下させる可能性があり、クラスの継承関係が非常に複雑な場合には再宣言が非常に面倒なので、より便利なメソッドを探していません。仮想継承を使用する以外に、C++でインタフェースの多重継承を有効にする方法はありますか?
を持っている私の霊魂力は、エラーが曖昧な基底クラスの関数への呼び出しであることを教えてください。 –
しかし、それは基本クラスではなく、基本インターフェースまたは基本構造のいずれかです。 –
[C++多重継承の可能な複製 - なぜあなたは働かないのですか?](http://stackoverflow.com/questions/5864466/c-multiple-inheritance-why-you-no-work) –