引自 C++ Primer 5th 19.2.1。dynamic_cast 运算符
dynamic_cast 具有以下形式:
dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)
其中 type 必须是类类型并且(通常)命名具有虚函数的类。在第一种情况下,
e
必须是一个有效的指针(第 2.3.2 节,第 52 页);第二,e
必须是左值;第三,e
不能是左值。在所有情况下,类型
e
必须是从目标类型公开派生的类类型、目标类型的公共基类或与目标类型相同。如果e
具有这些类型之一,则转换将成功。否则,施法失败。
如果对指针类型的 dynamic_cast 失败,则结果为 0。如果对引用类型的 dynamic_cast 失败,则运算符抛出类型异常bad_cast
但是,在这里我写了一个代码片段:
struct A {};
struct B : private A // note: *private* inheritance
{
A* test() {
return dynamic_cast<A*>(this);
}
};
int main()
{
B b;
if(b.test()==nullptr)
throw 1;
}
在上面的代码片段中,A
只是 的私有基数B
,c++ 入门没有考虑到这一点。但是,此代码片段可以编译并运行而不会出现错误。入门有错吗?