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

sky*_*oor 5 c++

我从C++ FAQ中找到了这个

通常,没有.

从私有派生类的成员函数或朋友,已知与基类的关系,从PrivatelyDer*到Base*(或PrivatelyDer&to 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

}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 4

从纯粹的机械角度来看,您是对的:对私有基类的强制转换将起作用并产生工作结果。

\n\n

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

\n\n

编辑:是的,演员阵容确实有效。根据标准的\xc2\xa75.4/7:

\n\n
\n

...即使基类类型不可访问,也可以使用显式类型转换的\n 转换表示法来执行以下 static_cast 和\n reinterpret_cast 操作\n(可选地后跟 const_cast\n 操作):

\n\n

\xe2\x80\x94 指向派生类类型的对象的指针或派生类类型的左值可以分别显式转换为指向明确基类类型的指针或引用;

\n
\n\n

[强调]

\n