我知道以下代码会导致编译错误:

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
}

这行不应该是编译错误吗?
所以我的gcc在将其标记为编译错误时是错误的,或者是无法想象的stroustrup错字,或者最有可能我错过了一些东西...

最佳答案

15.4.1中的实际报价为:



因此,似乎描述该代码的文本是正确的,但是出于错误的原因-dynamic_cast 不允许意外地违反对私有(private)和 protected 基类的保护,但这仅仅是因为使用它的格式不正确且会导致编译器错误,而不是因为使用它会产生空指针。而且,当然,文本所描述的代码绝对是不正确。

发生错误-也许它将在本书的第4版中得到解决。 :-]

(另外,请注意,如果BB_ival_slider声明ffriend,则代码将按照书中的描述进行操作。也许此friend声明已在本章的前面暗示,但我现在没有时间阅读仔细检查其中一种方法。)

07-25 22:58