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 ?