2009-12-10 2 views
1

Dans le programme C++:fonctions virtuelles pures

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

Si la fonction virtuelle, func() est redéfinie dans le corps de la classe B, il n'y a pas d'erreur. Mais lors de l'utilisation de l'opérateur de résolution d'étendue, le compilateur renvoie une erreur. Pourquoi est-ce?

+1

pas directement à voir avec votre question, mais l'en-tête standard est , pas

+1

iostream.h est ancienne Wich standard peut également être utilisé bien pas recommandé –

Répondre

13

Ce n'est pas directement liée à func être virtuel, vous devez toujours déclarer dans la classe:

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

    void func(); // add this 
}; 

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

Sinon, il ne saura pas que B définit func et essaiera d'utiliser la version virtuelle pure dans A, ce qu'il ne peut pas parce qu'il est purement virtuel – Xetius

+0

@Xetius: Please; Si vous ne le savez pas, essayez de compiler le code de test avant de répondre. S'il n'y a pas de 'func' défini dans B. Alors show() utilisera la version dans A. Ce qui est absolument correct. Parce qu'au moment de l'exécution, il appellera la version la plus dérivée appartenant à l'instance en cours. Si B ne définit pas 'func', alors il s'agit d'une classe abstraite et vous ne pourrez tout simplement pas instancier une instance de B. –

4

Vous devez déclarer que vous redéfinissez la fonction membre func() dans la classe B.

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