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
在指定的对象中查找请求的类类型,并返回指向对象该部分的指针/引用。如果找不到,则为指针转换返回 NULL,并为引用转换引发std::bad_cast
异常。在您的示例中,它失败是因为ptrBase
没有指向作为 Derived
类实例的对象,因此对象中没有要返回指针的Derived
节,因此它返回 NULL。 您需要更改此设置:
Base * ptrBase = new Base;
对此:
Base * ptrBase = new Derived;
您的问题是您正在向后使用动态投射。
如果你这样做了
Base *ptrBase = new Derived ;
然后它就会起作用。
派生的 IS 一个基数。基础不是派生的。
在示例代码中,创建 Base
的新实例:
Base * ptrBase = new Base;
ptrBase->BaseNum = 0;
Derived * ptrDerived = dynamic_cast<Derived *>(ptrBase);
因为Derived
是Base
的超集,但基只是Derived
的一个子集,你不能把ptrBase
指向的对象寻址为Derived
,因为它比Derived
"小"。
另一方面,如果你写
Base * ptrBase = new Derived;
ptrBase->BaseNum = 0;
Derived * ptrDerived = dynamic_cast<Derived *>(ptrBase);
那么一切都很好,因为现在ptrBase
指向的对象是Derived
.
对于dynamic_cast
,程序员有责任确保转换成功。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?