c++ - 使用带有基类指针的 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 的指针。这是一个好的解决方案还是可以解决不同的方式?
解决方案
您需要在您的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();
推荐阅读
- javascript - 没有使用 jQuery 渲染 href
- ios - 向 UILabel 添加填充
- c# - C# 在 if 语句中使用一系列索引
- apache-spark - PySpark 存储级别默认值冲突?
- java - Xstream 在未完成时停止写入文件
- c - MIPS 汇编代码 - 试图找出这段代码是关于什么的
- visual-studio-mac - Visual Studio for MAC Community 在双显示器上字体模糊
- reactjs - 我应该在挂钩中使用 useMemo 吗?
- r - R情绪分析中的check_input(x)错误
- database - 如何在 Firestore 中建模这个 NoSQL 数据结构(查看我的第一种方法)