2 votes

Fonction dérivée virtuelle pure C++

Je suis en train d'apprendre le C++ orienté objet et j'avais une question sur l'héritage virtuel/pur virtuel et l'héritage multi-niveaux.

Disons que j'ai un code simple comme celui-ci :

class Shape
{
    virtual int getWidth() = 0;
};
class Rectangle: public Shape
{
private:
    int length, width;
public:
    Rectangle(_length, _width) { length = _length; width = _width }
    int getWidth() { return width }
};
class Square: public Rectangle
{
private:
    int length;
public:
    Square(int _length):Rectangle(_length, _length) { length = _length };
    int getWidth() { return length+1 }; //arbitarily add 1 to distinguish
};

int main()
{
    Rectangle* r = new Square(5);
    std::cout << r->getWidth << std::endl;  //prints 6 instead of 5?  It's as if rectangles getWidth is virtual
}

Si je comprends bien, le polymorphisme utilisera la fonction de la classe "Base", à moins que getWidth ne soit spécifié comme virtuel. Je veux dire par là que l'appel final de r->getArea devrait utiliser la fonction getArea du Rectangle au lieu de celle du Carré.

Dans ce cas, je remarque que si je supprime la déclaration virtuelle pure dans Shape, nous obtenons le comportement que je viens de décrire. Le fait d'avoir une fonction virtuelle pure dans une classe de base rend-il automatiquement toutes les définitions de cette fonction virtuelles ?

4voto

Joachim Pileborg Points 121221

virtual est hérité. Si vous faites d'une fonction parent virtual alors il continuera à l'être virtual dans toutes les classes d'enfants.

4voto

P.W Points 3960

Il n'est pas nécessaire d'avoir une fonction virtuelle pure pour obtenir un comportement polymorphe. Une fonction virtuelle normale peut également l'accomplir.

Oui, en spécifiant une fonction comme virtual dans une classe signifie qu'elle reste virtual dans toutes les classes qui en sont dérivées.

À partir de C++11, il existe également la fonction override spécificateur :
Dans une déclaration ou une définition de fonction membre, override assure que la fonction est virtual et surcharge une fonction virtuelle d'une classe de base.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X