2017-01-04 44 views
1

我有兩個類具有相同的純虛方法:如何在類聲明之外實現我的顯式重寫?

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進行編譯?

微軟的MSDN文檔有一個工作示例。但他們使用__interface擴展名。我想達到相同的目標,但是符合標準C++ 03的代碼,如果它是可能的話。

謝謝!

+2

了'override'關鍵字是C++ 11的功能,和VS 2005使用一個編譯器在規範創建之前編寫。實際上並不需要指定'override'來實現虛函數。我建議嘗試刪除關鍵字。 –

+0

@Nicolas我正在使用的是當時使用的MS擴展。我可能不應該用這個例子來使它更清晰。但是,刪除它並不能解決問題:(謝謝 – QuinoaWrap

+0

好的,所以你的問題實際上是來自兩個接口的類似命名的函數? –

回答

-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(); 
}; 
相關問題