我知道下面的代码提供的编译错误:dynamic_cast的疑问:转换为受保护的基类
class A{ public : virtual void name(){cout<<typeid(this).name()<<endl;}; };
class B:protected A{public : virtual void name(){cout<<typeid(this).name()<<endl;};};
void foo(B* b)
{
A * a = dynamic_cast<A*>(b); //Error : 'A' is an inaccessible base of 'B'
return;
}
不过,为什么在C++ Stroustrup的书(15.4.1),他写道
class BB_ival_slider:public Ival_slider,protected BBslider{ //...
};
void f(BB_ival_slider*p)
{
// ok
BBslider* pbb2 = dynamic_cast<BBslider*>(p); // ok: pbb2 becomes 0
}
不应该是编译错误? 因此,无论我的海湾合作委员会是错误的标记为编译错误或不可思议,stroustrup错字或最振振有词我错过了...
有趣的问题 - 请注意,即使基础是虚拟的,并且子子类通过“public virtual”从同一个基础派生...我希望看到一个关于编译器为什么拒绝这个的C++标准引用。 – bdonlan
我很懒。 :(我通常按照Stroustrup的话作为标准。:) 但我认为有必要为这样一种生动的语言打开这个世界上最枯燥无味的标准报告。 –
@bdonlan:5.2。关于'dynamic_cast (pointer_to_class_D)'说'B'应该是一个**可访问的**明确的D类基类(重点是我的)。 –