我应该从私有派生类指针转换到它的基类吗?

时间:2010-03-21 19:31:59

标签: c++

我是从C ++ FAQ

中找到的
  

一般来说,没有。

     

来自一个成员函数或朋友   私人派生的,   与基类的关系是   已知,并从中向上转换   PrivatelyDer * to Base *(或   PrivatelyDer&安培;到Base&)是安全的;没有   需要或推荐演员表。

     

然而,PrivatelyDer的用户应该   避免这种不安全的转换,因为它   是基于私人决定的   PrivatelyDer,可能会有变化   没有通知。

如何理解上述词语?我认为解释不正确或准确。

我有这样的代码

class A{
};

class B: private A{
};

int main(){

    B *b = new B();
    A *a = new A();

    a = b;                    //wrong
    a = (A*)b;            //right

}

2 个答案:

答案 0 :(得分:4)

从纯粹的机械观点来看,你是对的:对私人基类的演员会起作用并产生工作结果。

常见问题解答的重点是,从设计角度来看,它通常是错误的。私人继承实际上应该是私有的 - 换句话说,即使它可能有用,你也不应该知道它会工作,并且在某些时候它可能会停止工作 - 因为它是正式的实现细节,而不是作为公共接口的一部分,他们可以在不使用继承的情况下重新实现该类。此时,演员阵容将不再起作用(但是因为你已经使用了演员阵容,编译器可能不会警告你它已经从你可能不应该做的事情变成了一些不可能工作的东西在所有)。

编辑:是的,演员 必然有效。根据该标准的§5.4/ 7:

  

......以下的static_cast和   reinterpret_cast操作   (可选地后跟一个const_cast   操作)可以使用   显式类型的强制表示法   转换,即使是基类   类型无法访问

     

- 指向派生对象的指针   类类型或派生的左值   类类型可以显式转换   指向或引用   明确的基类类型,   分别;

[强调补充]

答案 1 :(得分:1)

我认为解释是正确的。它表示,即使从BA进行演员表演,也不应该这样做。原因是继承是私有,应该被视为B的实现细节,该类的用户永远不应该关心。它与标记为private的任何内容都是相同的规则 - 它应该被视为类的内部。外部客户端应该只依赖public函数和属性 - 包括public继承。

就我个人而言,我从未发现私人继承的任何用途 - 我认为使用作文通常会更好。