如何从现有的基类对象创建派生类对象?

时间:2019-04-12 00:42:52

标签: c++ c++11

我试图创建一个派生类对象,并使用现有的基类对象填充数据成员(来自基类)。

在我的流程生命周期中,我已经有一个基类对象。为了做出一些决定,我必须创建一个新对象(从基类派生)。一种方法是公开评估者并复制数据。是否可以使用诸如聚合初始化或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;
}
  

预期输出:   你好,世界。这是我的名字:bar

编译错误

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

2 个答案:

答案 0 :(得分:2)

如果您想从Child来构建Base,则需要向Child添加一个构造函数,以完成此任务:

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

使用此方法时需要谨慎,因为它将允许从也从Child派生的另一个类构造Base。而且,如果Child有任何其他数据成员,则需要确保为其添加适当的初始化值或默认值。

答案 1 :(得分:-1)

使用C样式的强制类型转换可以实现以下目的:

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

但我不建议您使用此功能。如果类的内存布局不相似,则可能会失败。在这种情况下,等效的C ++强制转换是这样的:

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

编辑:原来这是未定义的行为。不要尝试:)