我正在尝试创建一个派生类对象并使用现有的基类对象填充数据成员(来自基类)。
\n\n在我的流程生命周期中,我已经有一个基类对象。对于某些决定,我必须创建一个新对象(从基类派生)。实现此目的的一种方法是公开评估者并复制数据。有没有我可以使用聚合初始化或dynamic_cast之类的解决方案?
\n\n#include <iostream>\n#include <string>\n\nusing namespace std;\n\nclass Base {\n protected: \n string name_;\n\n public:\n Base() : name_ ("foo")\n {\n }\n void ChangeName()\n {\n name_ = std::string {"bar"};\n }\n};\n\nclass Child final : Base {\n public:\n string GetName()\n {\n return name_;\n }\n};\n\nint main()\n{\n Base b;\n b.ChangeName();\n\n Child c = {b};\n cout<<"Hello World. Here is my name: " << c.GetName() << endl;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n预期输出:\n 你好世界。这是我的名字:酒吧
\n
编译错误
\n\ntry.cpp:33:17: error: could not convert \xe2\x80\x98{b}\xe2\x80\x99 from \xe2\x80\x98<brace-enclosed initializer list>\xe2\x80\x99 to \xe2\x80\x98Child\xe2\x80\x99\n Child c = {b};\nRun Code Online (Sandbox Code Playgroud)\n
如果你想Child从 a构造 a Base,你需要添加一个构造函数来Child实现:
Child(const Base &b): Base(b) { }
Run Code Online (Sandbox Code Playgroud)
您需要谨慎使用它,因为它将允许Child从同样派生自 的另一个类构造Base。如果Child有任何其他数据成员,您需要确保为它们添加适当的初始化或默认值。