c++ - dynamic_cast 和多态性

标签 c++ inheritance polymorphism dynamic-cast

这是我在这个网站上的第一个问题,所以请随时强调我的用词选择、问题结构等方面的任何问题。

最近,我在处理多态性时开始使用 dynamic_cast,我读到 dynamic_cast 不会创建该类的另一个实例,而是创建另一个对象指针的实例。

在测试dynamic_cast 时,我遇到了这个问题。这是代码:

//main.cpp

#include <iostream>

class Base{
public:
    int BaseNum;
    virtual void BaseFunction(){};
};

class Derived : public Base{
public:
    int DerivedNum; 
    virtual void DerivedFunction(){};
};

int main(){

    Base * ptrBase = new Base;
    ptrBase->BaseNum = 0;
    Derived * ptrDerived = dynamic_cast<Derived *>(ptrBase);
    ptrDerived->DerivedNum = 1;

    std::cout << ptrBase->BaseNum << ptrDerived->DerivedNum << std::endl;

    system("pause");
    return 0;
}

程序崩溃行:

ptrDerived->DerivedNum = 1;

调试时提示“无法读取内存”。我的结论是,如果原始内存分配是为层次结构中更高的类保留的,我不能沮丧,但我认为我可能是错的。

代码哪里出错了?

最佳答案

dynamic_cast 在指定对象中定位请求的类类型,并返回指向该对象部分的指针/引用。如果找不到,则为指针转换返回 NULL,并为引用转换抛出 std::bad_cast 异常。在您的示例中,它失败了,因为 ptrBase 未指向作为 Derived 类实例的对象,因此没有 Derived 部分对象内部返回一个指向的指针,所以返回NULL。你需要改变这个:

Base * ptrBase = new Base;

改为:

Base * ptrBase = new Derived;

关于c++ - dynamic_cast 和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29759603/

相关文章:

c++ - 我使用 cudaMemcpy 错了吗?

c++ - 游戏模式中更新方法的参数

Java 继承 : the strict default-abstract and default-default conflict rules

asp.net - 如何使用 Gson 在 asmx Web 服务的 Json 中包含对象类型

c# - 如何在 .NET 7 中使用 System.Text.Json 序列化多级多态类型层次结构?

c++ - 在 Direct2D 中绘制部分图像

c++ - 如何使用 C++ 通过标准输入获取可用数据的大小

c++ - 如何在所有尺寸下使这项工作(c++ 初学者文件输入)

java - “直接 self 参照导致循环” jackson 和继承

java - 为什么不使用 switch case 语句?