Как я могу создать объект производного класса из существующего объекта базового класса? - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать объект производного класса и заполнить члены-данные (поступающие из базового класса) существующим объектом базового класса.

В моем жизненном цикле процесса у меня уже был объект базового класса. Для некоторого решения я должен создать новый объект (производный от базового класса). Один из способов сделать это - выставить оценщиков и скопировать данные. Есть ли какое-либо решение, такое как агрегатная инициализация или dynamic_cast, который я мог бы использовать вместо этого?

#include <iostream>
#include <string>

using namespace std;

class Base {
    protected: 
        string name_;

    public:
        Base() : name_ ("foo")
        {
        }
        void ChangeName()
        {
            name_ = std::string {"bar"};
        }
};

class Child final : Base {
    public:
    string GetName()
    {
        return name_;
    }
};

int main()
{
    Base b;
    b.ChangeName();

    Child c = {b};
    cout<<"Hello World. Here is my name: " << c.GetName() << endl;

    return 0;
}

Ожидаемый результат: Привет, мир. Вот мое имя: бар

Ошибка компиляции

try.cpp:33:17: error: could not convert ‘{b}’ from ‘<brace-enclosed initializer list>’ to ‘Child’
     Child c = {b};

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Если вы хотите построить Child из Base, вам нужно добавить конструктор к Child, который сделает это:

Child(const Base &b): Base(b) { }

Вы должны быть осторожны при использовании этого, поскольку это позволит создать Child из другого класса, который также является производным от Base. И если Child имеет какие-либо другие элементы данных, вам необходимо обязательно добавить для них соответствующие значения инициализации или значения по умолчанию.

0 голосов
/ 12 апреля 2019

Нечто подобное возможно при использовании приведений в стиле C:

Child c(*(Child*)&b);

Но я бы не советовал вам использовать это.Может произойти сбой, если макеты памяти классов не похожи.Эквивалент C ++ для этой ситуации следующий:

Child c(*reinterpret_cast<Child*>(&b));

EDIT: Оказывается, это неопределенное поведение.Не пытайтесь это:)

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