2009-12-10 9 views
1

В программе C++:чистые виртуальные функции

   #include<iostream.h> 
       class A 
       { 
        public: virtual void func()=0; 
       }; 
       class B:public A 
       { 
        public: void show() 
          { 
            func(); 
          } 
       }; 
       void B::func() 
       { 
         cout<<"In B"<<endl; 
       } 
       int main() 
       { 
        B b; 
        b.show(); 
       } 

Если виртуальная функция, функ() переопределяется в теле класса В, нет никакой ошибки. Но при использовании оператора разрешения области видимости компилятор выдает ошибку. Почему?

+1

не напрямую, чтобы сделать с вашим вопросом, но стандартный заголовок , не 2009-12-10 10:24:54

+1

iostream.h в старом стиле стандарт которым также могут быть использованы, хотя не рекомендуется –

ответ

13

Это не связано напрямую с func быть виртуальным, вы всегда должны объявить его в классе:

class B:public A 
{ 
    public: void show() 
    { 
     func(); 
    } 

    void func(); // add this 
}; 

void B::func() 
{ 
    cout<<"In B"<<endl; 
} 
+3

В противном случае он не будет знать, что B определяет func и попытается использовать чистую виртуальную версию в A, чего она не может, потому что она является виртуальной – Xetius

+0

@Xetius: Please; если вы не знаете, попробуйте сначала скомпилировать тестовый код перед ответом. Если в B. не существует «func». Тогда show() будет использовать версию в A. Это абсолютно нормально. Потому что во время выполнения он будет вызывать самую производную версию, принадлежащую текущему экземпляру. Если B не определяет «func», то это абстрактный класс, и вы просто не сможете создать экземпляр экземпляра B. –

4

Вы должны объявить, что вы переопределить функцию-член FUNC() в классе В.

class B:public A 
{ 
    virtual void func(); 
public: 
    void show() {func(); } 
}; 
Смежные вопросы