考虑以下程序
#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
这样的指针转换的原因是什么?
允许
dynamic_cast
这样的指针转换的原因是什么?
因为dynamic_cast
可以/确实在运行时运行,并且到那时才发布编译器错误,现在已经晚了。
如果转换失败,则dynamic_cast
返回nullptr
。您需要检查并在需要时进行处理。