繁体   English   中英

dynamic_cast和多态

[英]dynamic_cast and polymorphism

这是我在这个网站上的第一个问题,所以请随意突出我的单词选择,问题结构等问题。

最近,我在处理多态时开始使用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在指定对象中定位请求的类类型,并返回指向该对象部分的指针/引用。 如果找不到,则为指针std::bad_cast返回NULL,并为引用std::bad_cast抛出std::bad_cast异常。 在您的示例中,它失败,因为ptrBase没有指向作为Derived类的实例的对象,因此对象中没有Derived部分返回指针,因此它返回NULL。 你需要改变这个:

Base * ptrBase = new Base;

相反:

Base * ptrBase = new Derived;

您的问题是您正在使用动态强制转换。

如果你这样做了

   Base *ptrBase = new Derived ;

然后它会工作。

衍生的IS A Base。 基础不是衍生的。

在示例代码中,您将创建一个Base的新实例:

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

由于DerivedBase的超集,但base只是Derived的子集,因此您无法将ptrBase指向的对象称为Derived ,因为它比Derived “小”。

另一方面,如果你写的话

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

然后一切都很好,因为现在ptrBase指向的对象是Derived

使用dynamic_cast ,程序员可以确保转换成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM