有没有一种方法可以通过指向基数的指针来复制派生类对象? 还是如何创建这样的副本构造函数?

例如:

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 [0]是否为Derived1对象,* B [1]是否为Derived2对象? 如果没有,我如何通过指向基类的指针复制派生类? 是否有通过基类或派生类构造复制构造函数的特定方法? 默认的复制构造函数是否足以胜任该示例?

#1楼 票数:5

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

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;
};

#2楼 票数:0

main行的第二行中(除了错别字),构造了Base类的两个实例,然后您要问,在最后两行中,这些对象是否会以某种方式立即发生变形并成为派生类的实例。 那当然是不可能的。

另外,请检查此答案

注意 :我只是在评论您提供的代码和用例。 使用虚拟Clone功能是复制多态对象的正确设计。

  ask by user4260490 translate from so

未解决问题?本站智能推荐:

3回复

相同派生类的构造方法和复制构造方法

是否可以使用复制构造函数从该派生类“ twin”初始化一个相同的派生类? 我的意思是我想初始化一个Computer类型的对象,该对象与我已经初始化的User类型的对象相同。 Computer cCarrier = User uCarrier; 之类的事情。 例如 main.cpp
3回复

C++复制构造函数在向量上清除衍生*

我有一个使用基类指针指向派生对象的类,因此我需要有一个自己的解释器来删除向量的元素以及自定义的复制和赋值功能。 我不完全确定实现以下结构并为其编写正确的副本,赋值构造函数和析构函数的首选方法。 我可以请你指导我吗? 我已经阅读了很多书并进行了搜索,但是我仍然不确定。 class Base
4回复

指向派生类的指针是否首先创建Base类?

我有以下代码 这给了我以下输出: 因此,当您创建指向派生类的指针时,它是不是首先创建基类的实例? 我不认为它是真的,因为D类的大小是证明。 但它甚至没有调用基类构造函数。 有谁能解释一下?
3回复

C++指向基类的指针尚未获得派生类成员函数,但使用派生创建了指针

我做了一个类,它是指向基类的指针的容器。 我可以添加基类对象以及派生类对象。 但是,当我尝试使用派生类对象的函数时,出现编译错误“'Base'类没有名为'name'的成员”。 代码如下所示: 它应该打印 我是基地 我是派生1 我是派生2 但是我在注释中的代码中遇到了编译
4回复

如何使用函数(而不是构造函数)将派生类对象分配给基类指针

问题总结我不知道如何通过函数(不是构造函数)使用 new-operator 创建派生类的对象,并有一个指向它的基类指针。 设置我的项目中有一个抽象基类和一个派生类: 我也有返回Derived对象的函数。 在某些时候,我声明了一个基类指针 我希望它稍后指向Derived对象。 我想要的是我想使用fun
3回复

是否将继承的基类复制到派生类?

就像标题中所说的那样:是继承中的基类被复制到派生类中#include我的意思是像#include那样,将基类中的代码复制到派生类中,或者仅创建基类中的一个对象,而子类仅使用它?在运行时?
1回复

通过基类对象访问派生类资源时出错

我有一个叫做 Base 的基类和一个叫做 Derived 的 Base 派生类,一个基类指针可以指向一个派生类对象,也可以访问它的资源,但我在做同样的事情时遇到错误。 这给了我一个错误 如果它太基础,请原谅我,我是 C++ 的初学者
1回复

派生类的函数未被调用

我正在处理基类Entity,我希望其派生类(Player,Enemy,Bullet)具有collideWith(), 我试图使Entity的collideWith()的派生函数正常工作,但是始终会调用基本版本,即使删除了关键字virtual,它也总是为空。 基类实体 及其功能,通常在