与基类指针一起使用以创建派生类对象

问题描述 投票:0回答:1

我很感兴趣是否有更好的方法可以从基类指针动态创建对象。这是我的情况的一个示例:

//我有一个正方形类型的基类指针数组。盒子是从正方形派生的。我首先使用方形指针创建一个带有params和new的新box对象。


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++ class dynamic base derived
1个回答
0
投票

您需要在您的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();
© www.soinside.com 2019 - 2024. All rights reserved.