Comment appeler la fonction surchargée de la classe parent en C++ ?
Le rendu attendu :
Child = 2
Parent = 1
Mon code :
class Parent{
int a;
public:
void display(){
a = 1;
cout << "Parent = " << a << endl;
}
};
class Child:public Parent{
int b;
public:
void display(){
b = 2;
cout << "Child = " << b << endl;
}
};
int main()
{
Parent *p = new Child();
Child c;
//write your code here
/* My solution :
c.display();
Parent* a = &c;
a->display();
*/
}
J'ai utilisé la liaison statique pour appeler avec succès la fonction membre display() de la classe parent
Cependant, je me demande s'il y a une meilleure solution pour cette question.
Quel est le but d'avoir cette ligne Parent *p = new Child();
? Est-ce un pointeur pointant vers un constructeur ?
Quelle est la différence entre cette ligne et Parent *p = new Child;
?
Comment appeler la fonction surchargée de la classe parent en C++ ?
Vous n'avez en fait remplacé aucune fonction dans votre exemple. Seules les fonctions membres virtuelles peuvent être remplacées et ne display
sont pas virtuelles.
J'ai utilisé la liaison statique pour appeler avec succès la fonction membre display() de la classe parent
Votre solution fonctionne car aucune fonction de remplacement ou virtuelle n'est impliquée. Une autre façon d'appeler la fonction membre masquée consiste à utiliser l'opérateur de résolution de portée :
c.Parent::display();
Cela utiliserait une liaison statique même si la fonction était virtuelle.
Quel est le but d'avoir cette ligne
Parent *p = new Child();
?
Il ne semble pas avoir de but dans votre programme. En général, new
est utilisé pour allouer des objets dynamiquement à partir du magasin gratuit.
Notez que la mémoire sera divulguée à moins que vous ne la désallouez explicitement avec delete
. Pas non plus qui delete p
aurait un comportement indéfini, car il pointe vers une base dont le destructeur n'est pas virtuel.
Est-ce un pointeur pointant vers un constructeur ?
No. p
pointe vers l'objet dynamique qui a été créé dans le magasin gratuit.
Quelle est la différence entre cette ligne et
Parent *p = new Child;
?
Sans parenthèses, vous utilisez la syntaxe d'initialisation par défaut. Avec des parenthèses vides, vous utilisez l'initialisation de la valeur.
Dans le cas de classes trivialement constructibles (telles que Parent
), l'initialisation par défaut initialisera par défaut les membres. Dans le cas de membres entiers, cela laisse les membres non initialisés. L'initialisation de la valeur initialisera plutôt la valeur des membres, ce qui pour les entiers signifie l'initialisation à zéro.
Dans le cas de classes non trivialement constructibles (telles que Child
), l'initialisation par défaut et la valeur invoquent le constructeur par défaut.