3

我在以下示例的 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)->funB() 时,它编译/运行良好。这种行为正确吗?

使用的编译器:gcc 版本 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)。

谢谢。

4

3 回答 3

2

static_cast在以下示例中,我收到“错误:'A' is an inaccessible base of 'B'” :

这是预期的:B是从 派生的A<B>,但是这种继承是受保护的:只有B及其派生类才能使用B派生自的事实A<B>

但它在使用reinterpret_cast(...) 时编译/运行良好。这种行为正确吗?

这是意料之中的:reinterpret_cast不关心类型之间的继承或其他关系。

如果可能,reinterpret_cast只为您提供一个与原始指针值具有相同值(指向相同字节)的指针。

这只是隐藏问题。

但是当使用 (...) C 风格的类型转换时,它编译/运行良好((Derived *)this)->funB()。这种行为正确吗?

这是意料之中的:C 风格的强制转换忽略访问控制。这只是隐藏问题。

解决方法是使您想要使用它的位置之间的继承关系A<B>B可访问性。

于 2011-12-19T06:08:31.573 回答
1

是的,这似乎是对的。你有protected继承,并且A<B>不是从 or 派生friendB,所以它看不到B's 基类来判断它static_cast是有效的。

于 2011-12-17T23:27:09.110 回答
1

受保护继承和私有继承不会在类之间创建一种关系,这是在static_cast类或其朋友之外进行操作所必需的。本质上,私有/受保护继承是实现的继承,而不是接口的继承。这就是为什么static_cast不起作用。

于 2011-12-17T23:35:20.430 回答