0
votes

Classe enfant: * this = function_which_returns_parent_object (), est-ce possible?

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?


5 commentaires

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 en Child ?


@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 cas Child ) stocker une variable parent Parent parent .


Il est maintenant modifié pour que getParentObject () renvoie un objet Parent avec des données non par défaut.


3 Réponses :


1
votes

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.


0 commentaires

1
votes

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();


0 commentaires

1
votes

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();
}


1 commentaires

La phrase du haut m'a aidé, car je ne peux pas attribuer pendant la construction. Mon exemple de code était mauvais.