Je serais reconnaissant si quelqu'un me éclairer sur le comportement suivant - Je l'ai capturé avec un court exemple de code:Pourquoi cette simple hiérarchie de classe C++ ne présente-t-elle pas un comportement polymorphe?
//header.h
class base
{
public:
base(int data):data1(data){}
virtual int getData(){return data1;}
private:
int data1;
};
class derived1 :public base
{
public:
derived1(int data):base(data-1),data2(data){}
virtual int getData(){return data2;}
private:
int data2;
};
class derived2 :public derived1
{
public:
derived2(int data):derived1(data-1),data3(data){}
virtual int getData(){return data3;}
private:
int data3;
};
//main.cpp
derived1 d1(20);
derived2 d2(10);
base& baseRefd1 = d1, baseRefd2 = d2;
cout << "call to baseRefd1.getData() yields: " << baseRefd1.getData();
cout << "call to baseRefd2.getData() yields: " << baseRefd2.getData();
derived1& derived1Refd1 = d1, derived1Refd2 = d2;
cout << "call to derived1Refd1.getData() yields: " << derived1Refd1.getData();
cout << "call to derived1Refd2.getData() yields: " << derived1Refd2.getData();
Et la sortie:
call to baseRefd1.getData() yields: 20
call to baseRefd2.getData() yields: 8
call to derived1Refd1.getData() yields: 20
call to derived1Refd2.getData() yields: 9
Comme vous pouvez voyez, quand une référence de base est utilisée comme un handle pour un seul niveau de dérivation, nous obtenons un polymorphisme - la version de getData() appelée est celle de la classe dérivée.
Mais lorsque la même référence de base est utilisée comme un handle pour une classe dérivée de 2 niveaux dans la hiérarchie, il n'y a pas de polymorphisme - la version de getData appelée est celle de la base. Lorsqu'une référence de type derived1 est utilisée, c'est-à-dire celle du niveau intermédiaire de la hiérarchie, il n'y a pas de polymorphisme même lorsque la poignée pointe vers un niveau de classe 1.
Je suis sûr que j'ai besoin d'apprendre quelque chose de basique ici. Appréciera toute orientation.
'base' [devrait] (http://www.gotw.ca/publications/mill18.htm) ont soit public destructeur virtuel ou un destructeur non virtuel protégé. – GManNickG
Arrête la déclaration de plusieurs variables dans une instruction. Vous n'économisez rien, ne vous causez que des problèmes. –