次のようにテストコードを作成しました。
#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;
}
このコードを書いた理由は、関数 funcBase() が DDerived のインスタンスで呼び出せるかどうかをテストするためです。このコードをコンパイルしようとすると、C++ コンパイラ (Visual Studio 2010) でコンパイル エラー メッセージが表示されました。私の意見では、このコードに問題はありません。なぜなら、それは純粋な仮想であるためfuncBase()
、インターフェイスの派生クラスで関数が実装される(したがってオーバーライドされる)ことが確実だからです。DDerived
つまり、型のポインター変数は、Implementation *
Implentation を派生させて function をオーバーライドするクラスのインスタンスに関連付ける必要がありますfuncBase()
。
私の質問は、なぜコンパイラがそのようなエラーメッセージを表示するのですか? C++ 構文がそのように定義されている理由。つまり、このケースをエラーとして扱うには? コードを実行するにはどうすればよいですか? インターフェイスの多重継承を許可したい。もちろん、「仮想パブリック」を使用するか、関数funcBase()
をImplementation
同様に再宣言すると
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
その後、すべてが問題なく実行されます。
しかし、仮想継承はパフォーマンスを低下させる可能性があり、クラスの継承関係が非常に複雑な場合、再宣言は非常に面倒なので、それをしたくなくて、より便利な方法を探しています。仮想継承を使用する以外に、C++ でインターフェイスの複数の継承を有効にする方法はありますか?