2017-01-04 41 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' 

требует ли конкретный синтаксисом для того, чтобы быть скомпилированы?

В документации Microsoft MSDN имеется рабочий пример. Но они используют расширение __interface. Я хочу добиться того же, но кода, который соответствует стандарту C++ 03, если это даже возможно.

Спасибо!

+2

'override' ключевое слово C++ 11 функция, и VS 2005 использует компилятор написанной до создания этой спецификации. На самом деле не требуется указывать 'override'though для реализации виртуальных функций. Я бы попробовал просто удалить ключевое слово. –

+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(); 
};