2016-09-12 8 views
-4

У меня есть чистый виртуальный базовый класс и производный класс. Я знаю, что мне разрешено реализовать виртуальный (не чистый) метод в базовом классе. То, что я не понимаю, почему я HAVE также реализовать один и тот же метод в производном классе, если то, что я хочу просто использовать базовую реализацию:Почему мне нужно реализовать виртуальную функцию в производном классе, если я хочу использовать реализацию базового класса

#include <iostream> 

using namespace std; 

class Abstract { 
public: 
    int x; 
    Abstract(){ 
     cout << "Abstract constructor" << endl; 
     x = 1; 
    } 
    virtual void foo() = 0; 
    virtual void bar(){ 
     cout << "Abstract::bar" << endl; 
    } 
}; 

class Derived : Abstract { 
public: 
    int y; 
    Derived(int _y):Abstract(){ 
     cout << "Derived constructor" << endl; 
    } 
    virtual void foo(){ 
     cout << "Derived::foo" << endl; 
    } 
    virtual void bar(){ 
     Abstract::bar(); 
    } 
}; 

int main() 
{ 
    cout << "Hello World" << endl; 
    Derived derived(2); 
    derived.foo(); 
    derived.bar(); //HERE I HAVE TO DEFINE Derived::bar to use it 
    return 0; 
} 
+0

В 'Derived' say' using Abstract :: bar() '? Также создайте 'Abstract' базовый класс' public'. –

+0

Нет причин, по которым 'bar' * must * должен быть реализован в производном классе. Какие ошибки вы говорите, что это неправильно? –

+0

Ваш вопрос основан на совершенно неправильной посылке. Вам не нужно переопределять нечистые функции-члены из базового класса. Что заставило вас думать, что вам нужно это сделать? – AnT

ответ

4

Вы не должны делать это. Вы можете сделать следующее:

class Derived : public Abstract { 

Таким образом, вы можете использовать общедоступные методы из базового класса.

+1

Это комментарий в лучшем случае. –

+1

Я пытался не реализовывать 'Derived :: bar', но тогда он не компилируется. – statquant

+0

Если вы собираетесь редактировать ninja, начните с чего-то большего, чем комментарий, требующий разъяснений. –