このようなことがあれば、私はある種の「三角継承」問題があります。別の親クラスの仮想メソッドの実装を使用することはできますか?
class System
{
public:
Interface() = default;
virtual ~Interface() {}
virtual void doSomething() = 0;
virtual bool somethingDone() const = 0;
virtual int trait1() const = 0;
virtual bool trait2() const = 0;
};
class SomethingImplementation
{
public:
SomethingImplementation() = default;
void doSomething() { (void)0; }
bool somethingDone() { return true; }
};
そしてIが異なるためのインタフェースのいくつかの実装を持っている:基本的に、私は同様に、インターフェース抽象基底クラスを定義を有し、そのインタフェースの一部に実装を定義するポリシー・クラスケース。いくつかのケースでは、私は単純な実装を使用すると、他の人に私は理解することはできませんどのような彼らに
class SystemA : public System, public SomethingImplementation {/*...*/};
class SystemB : public System, public SomethingImplementation {/*...*/};
class SystemC : public System, { /* with a custom implementation ... */ };
をカスタマイズしたいクラスシステムAまたはsystembのの詳細は、実装作業を行うことがあるかもしれないものです
ソリューション1
ステートメントを使用して、この場合は何もしていないように見えます。
59:13: error: cannot declare variable 'a' to be of abstract type 'SystemA'
22:7: note: because the following virtual functions are pure within 'SystemA':
6:18: note: virtual void System::doSomething()
7:18: note: virtual bool System::somethingDone() const
60:13: error: cannot declare variable 'b' to be of abstract type 'SystemB'
31:7: note: because the following virtual functions are pure within 'SystemB':
6:18: note: virtual void System::doSomething()
7:18: note: virtual bool System::somethingDone() const
63:38: error: invalid new-expression of abstract class type 'SystemA'
ソリューション2
は、余分なインターフェイスクラスを追加します。 SomethingInterface
クラスを作成し、SomethingInterface
からInterface
とSomethingImplementation
の両方を継承します。これは問題を通常の「ダイヤモンド継承」問題に変えますが、コンパイラに自分がしたいことをさせることができません。
親クラスの仮想メソッドのために別のクラスから実装を使用する方法は何ですか?
仮想継承を試してください。 'class SystemA:public System、public virtual SomethingImplementation'、' class System:public virtual SomethingInterface'などです。 –
同じエラーhttp://cpp.sh/7kroo –
仮想継承はこれとは関係ありません。 SomethingInterfaceとSystemに共通の祖先クラスはありません。 –