首页 > 解决方案 > 尝试使用 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 classSubclass Desktop并能够将参数分配给Desktop's constructor

标签: c++visual-c++

解决方案


你这样做的方式是不正确的。存储在object数组中的类型是 type Hardware。您只能成功地dynamic_cast将那些值HardwareHardware 继承的任何东西(这没什么)。

假设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 */));

推荐阅读