2017-02-07 2 views
0
class vehicle 
{ 
public: 
    virtual void drive() 
    { 
     cout<<"in vehicle drive"<<endl; 
    } 
}; 
class bus:public vehicle 
{ 
public: 
    void drive() 
    { 
     cout<<"in bus drive"<<endl; 
    } 
}; 
class supervehicle:public bus 
{ 
public: 
    void drive() 
    { 
     cout<<"in supervehicle"<<endl; 
    } 
}; 


int main() 
{ 
    bus *b; 
    b=new supervehicle(); 
    b->drive(); 
    return 0; 
} 

Je me attendais ouput comme « dans le lecteur de bus », mais la sortie est « dans supervehicle ». Si le mot-clé virtuel est associé à la méthode du lecteur dans la classe de bus, la sortie doit être dans le lecteur de bus. Je sais que nous avons hérité de la classe du véhicule, mais nous avons quand même créé le pointeur pour la classe de bus uniquement. Est-ce que quelqu'un pourrait m'aider pourquoi le mot-clé virtuel dans la classe de de véhicule affecte la méthode de la classe de de bus et où ai-je manqué le point?méthode dans la classe dérivée obtenu exécutée sans * mot-clé virtuel * dans la catégorie visée

+0

http://www.cppreference.com/w/cpp/language/virtual. Cela n'a rien à voir avec l'héritage virtuel. – chris

+0

http://stackoverflow.com/questions/41604948/not-defining-virtual-method-in-derived-class-as-well/41606164#41606164 – sameerkn

+0

Pas sur le point, mais 'bus * b; b = nouveau supervehicle(), 'devrait être' bus * b = nouveau supervehicle(), '. Prenez l'habitude d'initialiser les variables lorsque vous les créez. –

Répondre

3

Le mot-clé virtual est un spécificateur qui signifie que la fonction doit être appelée via la répartition dynamique. Il ne nécessite pas de répéter dans chaque classe dérivée; Une fois qu'une fonction membre est virtuelle, elle est virtuelle dans chaque classe dérivée.

Et celui appelé via dispatch dynamique est la version de la classe la plus dérivée qui l'écrase. Donc, dans votre cas, le type dynamique de l'objet pointé par b est supervehicle, donc la fonction appelée est supervehicle::drive, et non bus::drive.

Un spécificateur associé, qui est venu dans la révision 2011 de la norme C++ est override. Vous devriez l'utiliser sur des fonctions surchargées pour faire savoir au compilateur que vous essayez de surcharger une fonction virtuelle. Si vous avez fait une erreur dans le prototype de fonctions, le compilateur émettra un diagnostic.

+0

remercie l'homme. C'est ce que je cherche. – hawkins