我很感兴趣是否有更好的方法可以从基类指针动态创建对象。这是我的情况的一个示例:
//我有一个正方形类型的基类指针数组。盒子是从正方形派生的。我首先使用方形指针创建一个带有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的指针为止。这是一个好的解决方案,还是可以在另一种方式?
您需要在您的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();