2017-01-04 8 views
1

は、私は同じ純粋仮想メソッドを持つ2つのクラスがあります。クラス宣言の外で明示的なオーバーライドを実装するにはどうすればよいですか?

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

をそして私は、これらのインタフェースから派生するクラスを持っています。私はそれぞれの仮想機能を に上書きしたいと思います。私はこのようにそれを行うことができます(これは動作します):

class ConcreteClass : public InterfaceA, public InterfaceB 
{ 
    public: 

    void InterfaceA::doSomething() override 
    { 
     printf("In ConcreteClass::InterfaceA::doSomething()\n"); 
    } 

    void InterfaceB::doSomething() override 
    { 
     printf("In ConcreteClass::InterfaceB::doSomething()\n"); 
    } 
}; 

私の質問は、私はクラス宣言の外に私のメソッドの定義を持つことができるか、がありますか?だから私は自分の.cppファイルに入れておくことができます。私が最初にこれを試してみました:

// .h 
class ConcreteClass : public InterfaceA, public InterfaceB 
{ 
    public: 

    void InterfaceA::doSomething() override; 
    void InterfaceB::doSomething() override; 
}; 
// .cpp 
void ConcreteClass::InterfaceA::doSomething() 
{ 
    printf("In ConcreteClass::InterfaceA::doSomething()\n"); 
} 
void ConcreteClass::InterfaceB::doSomething() 
{ 
    printf("In ConcreteClass::InterfaceB::doSomething()\n"); 
} 

これは、Visual C++ 2005(VS 2005)にコンパイルされません。

error C2509: 'doSomething' : member function not declared in 'ConcreteClass' 

それはコンパイルするために、特定のsintaxが必要ですか?

MicrosoftのMSDNドキュメントには、動作例があります。しかし、彼らは__interface拡張を使用します。私は同じでも、標準C++ 03に準拠したコードを実現したいと考えています。

ありがとうございます!

+2

'override'キーワードは、C++ 11の機能である、とVS 2005のコンパイラを使用していますその仕様書が作成される前に書かれていた。仮想関数を実装するために 'override'を指定することは実際には要求されていません。私は単にキーワードを削除することをお勧めします。 –

+0

@Nicolas私が使用しているのは当時使用されていたMS内線番号です。私はおそらく、この例では明確にするために使用してはいけません。しかし、それを削除しても問題は解決されません:(おかあちゃん – QuinoaWrap

+0

OK、問題は実際には2つのインターフェイスから来る同様の名前の関数になりますか? –

答えて

-1

それはあなたが探しているまさにありませんにもかかわらず、明白な問題を回避するには、ヘルパー関数にディスパッチします:

class ConcreteClass : public InterfaceA, public InterfaceB 
{ 
public: 
    void InterfaceA::doSomething() override { 
     InterfaceA_doSomething(); 
    } 

    void InterfaceB::doSomething() override { 
     InterfaceB_doSomething(); 
    } 

private: 
    void InterfaceA_doSomething(); 
    void InterfaceB_doSomething(); 
}; 
関連する問題