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

C++ 如何从现有的基类对象创建派生类对象?,c++,c++11,C++,C++11,我试图创建一个派生类对象,并用现有的基类对象填充数据成员(来自基类) 在我的流程生命周期中,我已经有了一个基类对象。对于某些决策,我必须创建一个新对象(从基类派生)。这样做的一种方法是公开评估人员并复制数据。有没有像聚合初始化或动态_cast这样的解决方案可以替代 #include <iostream> #include <string> using namespace std; class Base { protected: string

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

在我的流程生命周期中,我已经有了一个基类对象。对于某些决策,我必须创建一个新对象(从基类派生)。这样做的一种方法是公开评估人员并复制数据。有没有像聚合初始化或动态_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;
}
#包括
#包括
使用名称空间std;
阶级基础{
受保护的:
字符串名称;
公众:
Base():名称(“foo”)
{
}
void ChangeName()
{
名称=std::字符串{“bar”};
}
};
班级儿童期末考试:基本{
公众:
字符串GetName()
{
返回名称;
}
};
int main()
{
碱基b;
b、 ChangeName();
子c={b};

cout使用C样式转换可以实现类似的功能:

Child c(*(Child*)&b);
<>但是我不建议你使用这个。如果类的内存布局不一样,它可能会失败。对于这种情况,等效的C++演员是:

Child c(*reinterpret_cast<Child*>(&b));
Child c(*重新解释演员表(&b));

编辑:结果表明这是未定义的行为。不要尝试:)

如果要从
构造
,则需要向
添加一个构造函数,以实现以下目的:

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

您需要谨慎使用,因为它将允许从另一个类构造
子类,该类也派生自
Base
。如果
子类
有任何其他数据成员,您需要确保为它们添加适当的初始化或默认值。

您有什么问题?编译错误?Inco正确的输出?你的问题是添加细节。@1201程序添加了编译错误,这是UB,简单明了的。即使你认为布局匹配,将程序描述编译成计算机可以理解的东西的复杂性使得这种方法完全不可靠。避免UB。我强调得太多了。这是不是e转换那是UB或成员访问权限?全部!你告诉计算机A是B而不是。我明白了,谢谢你的解释。我更新了我的答案。这是一个更好的解决方案,谢谢!快速问题:当我尝试不同的Base派生时,我得到以下错误:错误:“Base”是“Child”的不可访问的Base2'@VarunPandey这是因为
Base
Child1
的私有基(我也假设
Child2
。这将避免我提到的问题,但如果您有一个公共基类(`class Child3:public Base'),则会发生构造。
Child(const Base &b): Base(b) { }