首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法通过指向基类的指针来复制派生类对象?

有没有办法通过指向基类的指针来复制派生类对象?
EN

Stack Overflow用户
提问于 2015-01-14 19:02:43
回答 2查看 731关注 0票数 1

有没有办法通过指向基类的指针来复制派生类对象?或者如何创建这样的复制构造函数?

例如:

代码语言:javascript
运行
AI代码解释
复制
class Base { 
public: Base( int x ) : x( x ) {}
private: int x;
};

class Derived1 : public Base { 
public: 
Derived( int z, float f ) : Base( z ), f( f ) {}
private: 
float f;
};

class Derived2 : public Base {
public: 
Derived( int z, string f ) : Base( z ), f( f ) {}
private: 
string f;
};

void main()
{ 
Base * A = new *Base[2];
Base * B = new *Base[2];
A[0] = new Derived1(5,7);
A[1] = new Derived2(5,"Hello");
B[0] = Base(*A[0]);
B[1] = Base(*A[1]);
}

问题是*B是不是Derived1对象,*B1是Derived2对象?如果没有,我如何通过指向基类的指针来复制派生类?是否有通过基类或派生类构建复制构造函数的特定方法?对于这个例子,默认的复制构造函数足够好吗?

EN

回答 2

Stack Overflow用户

发布于 2015-01-14 19:05:41

您可以为此提供虚拟方法Clone

代码语言:javascript
运行
AI代码解释
复制
class Base { 
public:
    Base(int x) : x(x) {}
    virtual ~Base() {}
    virtual Base* Clone() const { return new Base(*this); }
private:
    int x;
};

class Derived1 : public Base { 
public: 
    Derived1(int z, float f) : Base(z), f(f) {}
    virtual Derived1* Clone() const { return new Derived1(*this); }
private: 
    float f;
};

class Derived2 : public Base {
public: 
    Derived2(int z, std::string f) : Base(z), f(f) {}
    virtual Derived2* Clone() const { return new Derived2(*this); }
private: 
    std::string f;
};
票数 5
EN

Stack Overflow用户

发布于 2015-01-14 19:27:45

main的第二行(除了拼写错误之外),您构造了类Base的两个实例,然后您会问,在最后两行中,这些对象是否会以某种方式动态变形并成为派生类的实例。这当然是不可能的。

另外,检查这个answer

注释:我只是对您提供的代码和用例进行评论。使用虚拟Clone函数是复制多态对象的正确设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27950526

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文