我试图创建一个派生类对象,并使用现有的基类对象填充数据成员(来自基类)。
在我的流程生命周期中,我已经有一个基类对象。为了做出一些决定,我必须创建一个新对象(从基类派生)。一种方法是公开评估者并复制数据。是否可以使用诸如聚合初始化或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};
答案 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));
编辑:原来这是未定义的行为。不要尝试:)