gpt4 book ai didi

c++ - 来自 C++/Stroustrup : converting to protected base class 的 dynamic_cast 疑问

转载 作者:太空狗 更新时间:2023-10-29 21:50:01 25 4
gpt4 key购买 nike

我知道下面的代码会产生编译错误:

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 的实际引用是:

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 0
}

That is the uninteresting case. However, it is reassuring to know that dynamic_cast doesn't allow accidental violation of the protection of private and protected base classes.

因此看起来描述代码的文本是正确的,但是由于错误的原因——dynamic_cast不允许允许意外违反私有(private)和protected base classes,但只是因为使用它会格式错误并导致编译器错误,而不是因为使用它会产生空指针。当然,文本描述的代码绝对是正确的。

错误时有发生——也许它会在本书的第 4 版中得到修正。 :-]

(另外,请注意,如果 BB_ival_sliderf 声明为 friend,则代码正如书中所描述的那样。也许这个 friend 声明在本章的前面已经隐含了,但我现在没有时间仔细阅读它以检查一种或另一种方式。)

关于c++ - 来自 C++/Stroustrup : converting to protected base class 的 dynamic_cast 疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com