c++ - 尝试使用 dynamic_cast 将基类对象(数组)转换为子类但没有成功
问题描述
我提出这个问题是因为我在web上的对象数组的dynamic_cast中找不到任何相关的解决方案,或者只是因为我没有理解它的概念,请引导我,谢谢
我目前正在处理一项任务,我必须使用 dynamic_cast 将基类对象(指针)转换为它的子类对象,以便访问子类中的其他方法。
首先,我将拥有这个数组
Hardware *object = new Hardware[100];
当需要访问 的子类时Hardware
,我认为我应该这样做:
Desktop *temp = dynamic_cast<Desktop*>(&object[0]);
但是temp
导致 NULL 指针
我问了一些朋友,他们说我必须做类似的事情
object[0] = new Desktop(//arguments);
然后只有我可以继续dynamic_cast of object[0]
,但它在操作员上显示错误(红线)=
:
no operator "=" matches these operands operand types are: Hardware = Desktop *
最后,我尝试了许多类似于object[0] = new Desktop(//arguments);
但没有成功的方法,有没有我错过的步骤?
class Hardware //This is the base class
{
private:
string code;
double price;
public:
Hardware();
Hardware(string a, double b){
code = a;
price = b;
}
virtual void foo(){}
}
class Laptop: public Hardware //More of subclasses like this
{
private:
string brand;
public:
Laptop();
Laptop(string a, string b, double c):Hardware(b, c) {
brand = a;
}
}
int main(){
//Have to create one base class object with ptr array
Hardware *object = new Hardware[100];
//friend suggest: object[0] = new Desktop("Acer", "COMP-001", 1200.00);
//I wanted to use dynamic_cast like this
Desktop *temp = dynamic_cast<Desktop*>(&object[0]);
//To access to subclasses method and constructor
temp->displayLaptop();
}
期待我可以向下转换的结果Hardware class
,Subclass Desktop
并能够将参数分配给Desktop's constructor
解决方案
你这样做的方式是不正确的。存储在object
数组中的类型是 type Hardware
。您只能成功地dynamic_cast
将那些值Hardware
或Hardware
继承的任何东西(这没什么)。
假设Desktop
是一个子类Hardware
(你实际上并没有显示它),那么dynamic_cast<Desktop*>(&object[0])
保证返回nullptr
.
数组的工作方式是分配内存来存储在内存中按顺序排列的特定数据类型。您不能期望只将该数据类型视为可能(并且在您的情况下确实)包含更多数据的派生类型。
如果您希望拥有一个任意硬件项的数组,则需要将每个项存储为一个指针:
Hardware** object = new Hardware*[100];
std::fill(object, object + 100, NULL);
object[0] = new Desktop;
你的朋友是对的,但是你没有改变object
存储指针类型的类型。这就是编译器错误告诉你的。
在这个阶段,我强烈建议您使用std::vector
而不是分配和管理该内存:
std::vector<Hardware*> object(100);
object[0] = new Desktop;
更好的是,使用智能指针:
// Example with shared pointers
std::vector<std::shared_ptr<Hardware>> object;
object.emplace_back(std::make_shared<Desktop>(/* args */));
// Example with unique pointers
std::vector<std::unique_ptr<Hardware>> object;
object.emplace_back(std::make_unique<Desktop>(/* args */));
推荐阅读
- xamarin - ListView 上的 HeightRequest 计算很奇怪?
- authentication - 如何使用 Azure AD B2C 为客户端流身份验证设置 URL/URI?
- r - 在容器中加载 for 循环结果
- python - 如何在 VSCode 中更改 Python 扩展语言环境?
- kotlin - 如何使用不同的运算符
- javascript - 运行第一个 react-native 应用程序失败
- apache-spark - Spark 使用自定义函数聚合行
- python - 当我尝试在 bash 中运行 python 命令时遇到问题
- r - 将列名传递给 mutate_at 中的用户定义函数
- python - pycharm 查找同名函数