Фактическая цитата из 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
}
Это неинтересный случай. Тем не менее, отрадно знать, что dynamic_cast
не допускает случайного нарушения защиты частных и защищенных базовых классов .
Таким образом, может показаться, что текст, описывающий код, является правильным, но по неправильным причинам - dynamic_cast
не допускает случайного нарушения защиты частных и защищенных базовых классов, но только потому что его использование будет некорректным и приведет к ошибке компилятора, а не потому, что его использование приведет к нулевому указателю. И, конечно, код, который описывает текст, является определенно в правильно.
Ошибки случаются - возможно, это будет исправлено в 4-м издании книги. : -]
(Также обратите внимание, что если BB_ival_slider
объявляет f
значением friend
, то код будет вести себя так, как описано в книге. Возможно, это объявление friend
подразумевалось ранее в глава, но у меня сейчас нет времени, чтобы внимательно прочитать ее, чтобы проверить, так или иначе.)