尝试使用dynamic_cast将基类对象(数组)转换为子类,但没有解决

时间:2019-08-23 00:23:17

标签: c++ visual-c++

我之所以提出这个问题,是因为我在网络上的object array的dynamic_cast中找不到任何相关的解决方案,或者只是因为我不了解它的概念,请带我过来,谢谢

我目前正在处理一个赋值,必须使用dynamic_cast将基类对象(指针)转换为它的子类对象,才能访问子类中的其他方法。

首先我要有这个数组 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/RV_Posters" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="52dp" android:layout_marginBottom="489dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.228" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>

当需要访问Hardware *object = new Hardware[100];的子类时,我认为我应该这样做: Hardware

但是Desktop *temp = dynamic_cast<Desktop*>(&object[0]);导致NULL指针

我问了一个朋友,他们说我必须做类似的事情 temp

然后只有我可以继续进行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

2 个答案:

答案 0 :(得分:1)

您的操作方式不正确。 object数组中存储的类型为Hardware。您只能将这些值dynamic_cast成功HardwareHardware 继承的任何内容(没什么)。

假设DesktopHardware的子类(您并未实际显示),那么保证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 */));

答案 1 :(得分:1)

您误解了动态投射的作用。

使用示例: 假设您有两个类Square和Circle,它们都继承自Shape类。

生产者创建正方形或圆形,但将指针传递给Shape。

然后通过动态投射,可以尝试将“形状”的指针转换为“圆”指针。如果生产者制作了Square,则投射将失败,返回nullptr。如果确实是一个Circle,那么您将获得一个指向Circle的指针。

在您的情况下,您将创建Shape并尝试使用动态投射将指针转换为Square ...这种方式不起作用。