gpt4 book ai didi

c++ - 使用非多态类向下转换 dynamic_cast,为什么它不能编译?

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:02 26 4
gpt4 key购买 nike

我有以下代码:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com