c++ - dynamic_cast 以意想不到的方式成功
问题描述
我正在玩dynamic_cast
以了解它的用法并想出了下面提供的代码。我曾经相信dynamic_cast<D*>(B*)
成功当且仅当:
B
是一种多态类型,即它有一个虚函数 ANDD
来源于B
但是在下面的代码中Base
,NonDerived
类与上述方式无关,仍然dynamic_cast<NonDerived*>(Base*)
成功。我原以为它会失败并返回 a NULL
。哪条 C++ 规则在这里生效?
我正在使用符合 C++11 的编译器。
#include <iostream>
class Base {
public:
virtual ~Base() = default;
};
class Derived: public Base {
public:
void DerivedFun(){
std::cout << "Derived" << std::endl;
}
};
class NonDerived{
public:
void NonDerivedFun(){
std::cout << "NonDerived" << std::endl;
}
};
int main(){
Base *pb = new Derived();
Derived *pd = dynamic_cast<Derived*>(pb); // Expected this to succeed and it did
pd->DerivedFun(); // Prints "Derived" as expected
NonDerived *pn = dynamic_cast<NonDerived*>(pb); // Expected it to fail but it succeeded?
pn->NonDerivedFun(); // Prints "NonDerived", expected this to throw some null pointer exception!!
delete pb;
return 0;
}
解决方案
pn->NonDerivedFun(); // 打印“NonDerived”,预计这会抛出一些空指针异常!!
取消引用空指针时,没有“空指针异常”之类的东西。这样做是未定义的行为。为避免在这种情况下发生这种情况,您必须检查是否dynamic_cast
成功:
if (pn != nullptr) {
pn->NonDerivedFun();
}
推荐阅读
- pdf - 有什么办法可以在线查看PDF图层
- c++ - 什么时候 std::is_convertible_v
是假的? - tensorflow - 我正在用flask部署接口,接口的内容是深度学习模型,请问如何实现热部署?
- python - 当我尝试预测不同的周期数时,时间序列中的 RMSE 值是否可能不同?
- javascript - 在导航栏中移动按钮,最佳实践?
- c# - c# 应用程序在调试下工作,但在发布模式下不工作
- php - 如何将元素附加到表单
- javascript - 重用不同内容的相同功能
- python - 将三个 RGB 图像组合成一个 RGB 图像
- amazon-web-services - 有没有办法使用 AWS Amplify 更改架构?