- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下代码:
using namespace std;
class BaseOk
{
public:
virtual void ImplementMe()
{
};
};
class DerivedOk : public BaseOk
{
public:
void ImplementMe()
{
}
};
class CBase { };
class CDerived: public CBase { };
int main()
{
CBase b; CBase* pb;
CDerived d; CDerived* pd;
pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base
pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived -> this doesn't compile
// Polymorphic case
BaseOk b2; BaseOk* pb2;
DerivedOk d2; DerivedOk* pd2;
pb2 = dynamic_cast<BaseOk*>(&d2); // ok: derived-to-base
pd2 = dynamic_cast<DerivedOk*>(&b2); // wrong: base-to-derived -> this returns a NULL pointer
}
带有指针“pd”的行执行向下转换,我同意它应该失败,因为结果是一个完全不同的对象。我的问题是:为什么该行中的 dynamic_cast 根本不编译,而只是返回 NULL 指针?
我正在使用 MSVC2012 编译器
最佳答案
Why doesn't the
dynamic_cast
in that line compile at all instead of just returning a NULL pointer?
将此视为一项功能/设施而不是限制。
dynamic_cast
是一种我们可以根据指针/引用找到对象的 RTTI(运行时类型信息)的机制。
现在假设如果一个类根本不是多态的(即不包含任何 virtual
方法),那么 dynamic_cast
肯定会总是失败。
这意味着您不必在通过概率为 0 的地方使用 dynamic_cast
。 为什么要在编译时已知的事情上浪费机器周期?这就是编译器立即为您提供便利的原因。
这还有一个隐藏的优势。假设您正在使用带有引用的 dynamic_cast
,如果失败则抛出异常。任何人都想为编译时已知的东西处理异常吗?
关于c++ - 使用非多态类向下转换 dynamic_cast,为什么它不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408746/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!