static_cast限制对公共成员函数的访问?

时间:2011-12-17 23:22:09

标签: c++ templates inheritance access-modifiers static-cast

我在以下示例的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)。

感谢。

3 个答案:

答案 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不起作用的原因。