У меня есть два класса с тем же чисто виртуальным методом:Как я могу реализовать явное переопределение вне объявления класса?
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, если это даже возможно.
Спасибо!
'override' ключевое слово C++ 11 функция, и VS 2005 использует компилятор написанной до создания этой спецификации. На самом деле не требуется указывать 'override'though для реализации виртуальных функций. Я бы попробовал просто удалить ключевое слово. –
@Nicolas Тот, который я использую, является расширением MS, используемым тогда. Я должен, вероятно, не использовать его для этого примера, чтобы сделать его более ясным. Но да, удаляя его, проблема не устраняется :(Спасибо – QuinoaWrap
ОК, так что ваша проблема на самом деле связана с аналогичными функциями, исходящими из двух интерфейсов? –