J'essaye de créer une classe enfant qui se comporte presque de la même manière que la classe parent. La seule différence est que l'enfant a des méthodes supplémentaires.
Parent getParentObject() { return Parent(123); } class Parent { public: Parent(int a) : a(a) {} int a = 0; }; class Child : public Parent { public: Child() { *this = getParentObject(); } };
Est-ce possible?
3 Réponses :
Oui, mais dans ce cas, ce n'est pas obligatoire. Vous pouvez le faire dans une liste d'initialiseurs:
class Child : public Parent { public: Child():Parent() { } };
Si le parent n'a qu'un constructeur avec des arguments, il est nécessaire de le faire pour initialiser le parent. Les arguments peuvent aller à l'intérieur de l'appel du constructeur, et vous pouvez également utiliser des variables déclarées dans le constructeur enfant.
En supposant un constructeur de copie pour votre classe parent, alors simplement ceci
class Child : public Parent { public: Child() : Parent(getParentObject()) { } }; Child c;
ou ceci (qui est plus similaire à votre exemple)
class Child : public Parent { public: Child(const Parent& parent) : Parent(parent) { } }; Child c = getParentObject();
La ligne
Child() : Parent(getParentObject())
n'est possible que si l'affectation de Parent
à Child
est possible par définition de classe. Vous devez avoir operator =
défini ou un constructeur de copie si vous utilisez static_cast
.
Mais la définition de Child ()
est mal formée, car Parent n'a pas de ctor par défaut.
Child() : Parent(123) {}
Tous les sous-objets sont default-initialized, et la classe de base est toujours un sous-objet de la classe dérivée. Les constructeurs définis par le compilateur dans Parent
sont supprimés car l'utilisateur a défini un constructeur personnalisé.
L'ensemble des exigences ci-dessus peut être omis par
Child() // <-- no initialization list, all sub-object are default-initialized { *this = getParentObject(); }
La phrase du haut m'a aidé, car je ne peux pas attribuer pendant la construction. Mon exemple de code était mauvais.
Vous voulez dire
* this = getParentObject ()
? C'est du C ++ légal mais c'est complètement inutile car un objet enfant obtient de toute façon toutes les données de son parent. Vous n'avez rien à faire de spécial pour qu'un objet enfant se comporte de la même manière que son objet parent, cela arrive quand même.C'est la même chose que
* this = Parent ()
et n'accomplit rien au-delà de ce que l'initialisation de la base a déjà fait.... ou recherchez-vous un moyen de convertir une instance
Parent
existante enChild
?@john oui, édité. Il y a une fonction d'une bibliothèque qui, lorsqu'elle est appelée, retourne un objet de type
Parent
dans ce cas avec des données, et je ne veux pas que ma classe (dans ce casChild
) stocker une variable parentParent parent
.Il est maintenant modifié pour que
getParentObject ()
renvoie un objetParent
avec des données non par défaut.