为什么当目标指针不是基类的类型时,dynamic_cast才允许为多态类产生一个空指针?

问题描述 投票:1回答:1

考虑以下程序

#include <iostream>
#include <iomanip>

struct A
{
};

struct C
{
};

int main()
{
    C *pc = nullptr;

    A *pa1 = dynamic_cast<A *>( pc );

    std::cout << "pa1 == nullptr is " << std::boolalpha << ( pa1 == nullptr ) << '\n';

    A *pa2 = pc;

    std::cout << "pa2 == nullptr is " << std::boolalpha << ( pa2 == nullptr ) << '\n';
}

对于两个指针声明pa1和pa2,编译器报告错误,不允许进行此类初始化。

例如,clang HEAD 10.0.0编译器发出以下错误。

prog.cc:19:14: error: 'C' is not polymorphic
    A *pa1 = dynamic_cast<A *>( pc );
             ^                  ~~
prog.cc:23:8: error: cannot initialize a variable of type 'A *' with an lvalue of type 'C *'
    A *pa2 = pc;
       ^     ~~
2 errors generated.

现在让我们将C类设为多态类。

#include <iostream>
#include <iomanip>

struct A
{
};

struct C
{
    virtual ~C() = default; 
};


int main()
{
    C *pc = nullptr;

    A *pa1 = dynamic_cast<A *>( pc );

    std::cout << "pa1 == nullptr is " << std::boolalpha << ( pa1 == nullptr ) << '\n';

    A *pa2 = pc;

    std::cout << "pa2 == nullptr is " << std::boolalpha << ( pa2 == nullptr ) << '\n';
}

并且只有第二个声明会产生错误。 dynamic_cast有效。

rog.cc:22:8: error: cannot initialize a variable of type 'A *' with an lvalue of type 'C *'
    A *pa2 = pc;
       ^     ~~
1 error generated.

允许dynamic_cast这样的指针转换的原因是什么?

c++ polymorphism c++17 dynamic-cast nullptr
1个回答
0
投票

允许dynamic_cast这样的指针转换的原因是什么?

因为dynamic_cast可以/确实在运行时运行,并且到那时才发布编译器错误,现在已经晚了。

如果转换失败,则dynamic_cast返回nullptr。您需要检查并在需要时进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.