2

具体的なクラスからメソッドを明示的に呼び出すことなく、具体的なクラスによって提供される実装を使用して、インターフェイスから純粋仮想メソッドを実装したいと考えています。例:

class InterfaceA{  
public:  
    virtual void foo() = 0;  
};

class InterfaceB:public InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};

class ConcreteAB: public InterfaceB, public ConcreteA{  
public:  
    virtual void bar(){}//implements bar() from interface  
};

このシナリオでは、コンパイラはクラス ConcreteAB での foo() の実装を要求します。これは、InterfaceB には実装されておらず、InterfaceA から継承されているためです。

ConcreteA::foo() を呼び出すラッパーを使用せずに、ConcreteA の実装を使用するようにコンパイラに指示する方法はありますか?

4

2 に答える 2

5

仮想InterfaceA基底クラスを作成します。

class InterfaceB : public virtual InterfaceA {  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA {  
public:  
   virtual void foo(){}//implements foo() from interface  
};
于 2012-12-26T18:46:53.697 に答える
4

仮想継承が必要です。

階層の最上位にあるインターフェイスAは、実質的にすべての直接のサブクラスに継承される必要があります。

class InterfaceB:public virtual InterfaceA{  
public:  
   virtual void bar() = 0;  
};

class ConcreteA : public virtual InterfaceA{  
public:  
   virtual void foo(){}//implements foo() from interface  
};
于 2012-12-26T18:58:05.623 に答える