本书The c++ programming language包含以下代码:
class BB_ival_slider : public Ival_slider, protected BBslider {
// ...
};
void f(BB_ival_slider* p)
{
Ival_slider* pi1 = p; // OK
Ival_slider* pi2 = dynamic_cast<Ival_slider*>(p); // OK
BBslider* pbb1 = p; // error: BBslider is a protected base
BBslider* pbb2 = dynamic_cast<BBslider*>(p); // OK: pbb2 becomes nullptr
}
我尝试使用以下代码来更好地理解此行为:
#include <iostream>
class Ival_slider {
public:
Ival_slider() {
std::cout << "Ival_slider called" << '\n';
}
};
class BBslider {
public:
BBslider() {
std::cout << "BBslider called" << '\n';
}
};
class BB_ival_slider : public Ival_slider, protected BBslider {
public:
BB_ival_slider() {
std::cout << "BB_ival_slider called" << '\n';
}
};
int main() {
BB_ival_slider* p = new BB_ival_slider{};
Ival_slider* p1 = p;
Ival_slider* p2 = dynamic_cast<Ival_slider*>(p);
BBslider* pbb2 = dynamic_cast<BBslider*>(p);
if (pbb2) {
std::cout << "true" << '\n';
}
}
然而,
BBslider* pbb2 = dynamic_cast<BBslider*>(p);
似乎无法按预期工作。
g ++ -std = c ++ 11 -O0 -g3 -Wall -c -fmessage-length = 0 -o cast.o&#34; .. \\ cast.cpp&#34;
.. \ cast.cpp:在函数&#39; int main()&#39;:
.. \ cast.cpp:29:43:错误:&#39; BBslider&#39;是BB_ival_slider&#39;
无法访问的基础 BBslider * pbb2 = dynamic_cast(p);
^
.. \ cast.cpp:29:43:错误:&#39; BBslider&#39;是BB_ival_slider&#39;
无法访问的基础
我认为dynamic_cast应该至少返回nullptr。这本书错了吗?我正在使用GCC 4.9.2。
答案 0 :(得分:0)
dynamic_cast
这里与static_cast
没什么不同,编译器发现用户代码试图访问受保护的基础,这是非法的。 dynamic_cast
不会隐藏或推迟任何编译时错误。如果在编译时可以确定强制转换是非法的,编译器将永远不会生成任何代码,并依赖于您在运行时检查强制转换是否实际上是错误的。