【发布时间】:2015-04-04 15:43:07
【问题描述】:
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 "..\\cast.cpp"
..\cast.cpp:在函数“int main()”中:
..\cast.cpp:29:43: 错误:“BBslider”是“BB_ival_slider”的不可访问基础
BBslider* pbb2 = dynamic_cast(p);
^
..\cast.cpp:29:43: 错误:“BBslider”是“BB_ival_slider”的不可访问基础
我认为 dynamic_cast 至少应该返回 nullptr。书错了吗?我正在使用 GCC 4.9.2。
【问题讨论】:
-
受保护的继承是什么意思?只需使用公共继承和聚合。让生活更轻松