Edi*_*iac 4 c++ polymorphism inheritance 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;
}
Run Code Online (Sandbox Code Playgroud)
该计划在该行中崩溃:
ptrDerived->DerivedNum = 1;
Run Code Online (Sandbox Code Playgroud)
在调试时,它说"无法读取内存".我的结论是,如果原始内存分配是为层次结构中较高的类保留的,我不能贬低,但我想我可能错了.
代码在哪里出错了?
dynamic_cast在指定对象中查找请求的类类型,并返回指向该对象部分的指针/引用.如果找不到,则为指针强制转换返回NULL,并std::bad_cast为引用强制转换抛出异常.在您的示例中,它失败,因为ptrBase它没有指向作为Derived类实例的对象,因此Derived对象中没有要返回指针的节,因此它返回NULL.你需要改变这个:
Base * ptrBase = new Base;
Run Code Online (Sandbox Code Playgroud)
相反:
Base * ptrBase = new Derived;
Run Code Online (Sandbox Code Playgroud)