首页 > 解决方案 > 使用带有基类指针的 new 创建派生类对象

问题描述

如果有更好的方法从基类指针动态创建对象,我很感兴趣。这是我的情况的一个例子:

// 我有一个正方形类型的基类指针数组。盒子来源于正方形。我首先使用方形指针创建一个带有新参数的新框对象。


32     square * sqr_arr[10];
33     
34     square * a_square;
35     
36     a_square = new box(arr, 4, 5, 7);
37 
38     box * temp = dynamic_cast<box *>(a_square);
39 
40     sqr_arr[0] = new box(*temp);
41     
42     sqr_arr[0]->display();

我的麻烦是,在我的实际程序中,我不断根据 AZ 排序移动数组中的指针,但我很难理解每次我需要知道我将创建哪个派生类而不是指针“知道”它指向什么并创建该类型的对象。

假设在上面的代码中,我想将 sqr_arr[0] 移动到 sqr_arr[1]。无论如何 sqr_arr[1] 可以通过正确使用 new 来制作副本。例如,在我的实际程序中,sqr_arr 可以创建许多不同的对象,所以我唯一的解决方案是使用 dynamic_cast 进行迭代,直到它返回一个可以接受的指向派生 * temp 的指针。这是一个好的解决方案还是可以解决不同的方式?

标签: c++classdynamicbasederived

解决方案


您需要在您的square类中实现一个虚拟克隆方法,该方法box和其他派生类可以覆盖,例如:

class square
{
public:
    virtual square* clone() = 0;
};

class box : public square
{
public:
    square* clone() override { return new box(*this); }
};

...

square* sqr_arr[10];

sqr_arr[0] = new box(arr, 4, 5, 7);
...
sqr_arr[1] = sqr_arr[0];
sqr_arr[0] = sqr_arr[1]->clone();
sqr_arr[0]->display();

推荐阅读