Дочерний класс: * this = function_which_returns_parent_object (), возможно ли это? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать дочерний класс, который ведет себя почти так же, как родительский класс. Разница лишь в том, что у ребенка есть несколько дополнительных методов.

Parent getParentObject()
{
    return Parent(123);
}

class Parent
{
public:
    Parent(int a) : a(a)
    {}

    int a = 0;
};

class Child : public Parent
{
public:
    Child()
    {
        *this = getParentObject();
    }
};

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Если предположить конструктор копирования для вашего родительского класса, то просто это

class Child : public Parent
{
public:
    Child(const Parent& parent) : Parent(parent)
    {
    }
};

Child c = getParentObject();

или это (что больше похоже на ваш пример)

class Child : public Parent
{
public:
    Child() : Parent(getParentObject())
    {
    }
};

Child c;
1 голос
/ 01 апреля 2020

Строка

 *this = getParentObject();

возможна, только если для определения класса возможно присвоение Parent для Child. Вы должны определить operator= или конструктор копирования, если вы go с static_cast.

Но определение Child() неверно, потому что у Parent нет ctor по умолчанию.

Child() // <-- no initialization list, all sub-object are default-initialized
{
    *this = getParentObject();
}

Все подобъекты инициализируются по умолчанию, а базовый класс всегда является подобъектом производного класса , Определенные компилятором конструкторы в Parent удалены, потому что пользователь определил пользовательский конструктор.

Весь набор требований выше может быть опущен с помощью

Child() : Parent(123) {}

или определите конструктор копирования \ перемещения для Parent и используйте

Child() : Parent(getParentObject())

, если вам нужно.

1 голос
/ 01 апреля 2020

Да, но в этом случае это не требуется. Вы можете сделать это в списке инициализатора:

class Child : public Parent
{
public:
    Child():Parent()
    {

    }
};

Если у Родителя есть только конструкторы с аргументами, это необходимо сделать для инициализации Родителя. Аргументы могут go внутри вызова конструктора, и вы также можете использовать переменные, объявленные в конструкторе Child.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...