我在以下示例的static_cast中收到“错误:'A'是'B'无法访问的基础”:
template<typename Derived>
class A {
protected:
void funA() { static_cast<Derived *> (this)->funB(); }
};
class B: protected A<B> {
public:
void funB() {}
void funC() { funA(); }
};
int main() {
B().funC();
return 0;
}
但是当使用reinterpret_cast或C风格类型转换((Derived *)this) - &gt; funB()时,它编译/运行良好。这种行为是否正确?
使用的编译器: gcc版本4.5.1 20100924(Red Hat 4.5.1-4)(GCC)。
感谢。
答案 0 :(得分:2)
我在以下示例的
static_cast
中收到“错误:'A'是”B“无法访问的基础:
这是预期的:B
派生自A<B>
,但此继承受到保护:只有B
及其派生类可以使用从B
派生的事实{ {1}}。
但是当使用
A<B>
(...)时,它编译/运行良好。这种行为是否正确?
这是预期的:reinterpret_cast
不关心继承或类型之间的其他关系。
如果可能的话,reinterpret_cast
只会给你一个与原始指针值具有相同值(指向同一字节)的指针。
这只是隐藏问题。
但是当使用(...)C风格的类型转换
reinterpret_cast
时,它编译/运行良好。这种行为是否正确?
这是预期的:C风格的强制转换会忽略访问控制。 这只是隐藏问题。
修复方法是在((Derived *)this)->funB()
和A<B>
可访问的之间建立继承关系。
答案 1 :(得分:1)
是的,这似乎是正确的。您已获得protected
继承,并且A<B>
不是来自friend
的{{1}},因此它无法看到B
的基类来判断B
有效。
答案 2 :(得分:1)
受保护和私有继承不会在类之间创建是关系,这是在类或其朋友之外执行static_cast
所必需的。本质上,私有/受保护的继承是实现的继承,而不是接口的继承。这就是static_cast
不起作用的原因。