C++ 我应该将指针从私有派生类强制转换到它的基类吗?

C++ 我应该将指针从私有派生类强制转换到它的基类吗?,c++,C++,我从C++常见问题中找到了这个 一般来说,没有 来自某个函数的成员或朋友 私有派生类 与基类的关系是 已知,并从 PrivatelyDer*至基地*(或 PrivatelyDer&to Base&)是安全的;不 需要或建议使用cast 但是,PrivatelyDer的用户应该 避免这种不安全的转换,因为它 是基于 PrivatelyDer,并可能发生变化 没有通知 如何理解上面的单词?我认为这个解释既不正确也不准确 我有这样的代码 class A{ }; class B: private A{

我从C++常见问题中找到了这个

一般来说,没有

来自某个函数的成员或朋友 私有派生类 与基类的关系是 已知,并从 PrivatelyDer*至基地*(或 PrivatelyDer&to Base&)是安全的;不 需要或建议使用cast

但是,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

}

我认为这个解释是正确的。它说,即使可以从
B
a
进行转换,也不应该这样做。原因是继承是私有的,应该被视为
B
的一个实现细节,类的用户永远不应该关心这个细节。它与任何标记为
private
的规则相同-它应该被视为类的内部规则。外部客户端应仅依赖于
public
函数和属性-包括
public
继承


就我个人而言,我从未发现私有继承有任何用处——我认为使用组合通常更好。

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

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

编辑:是的,演员阵容确实有效。根据本标准§5.4/7:

。。。以下是静态_cast和 重新解释强制转换操作 (可选后接const_cast) 操作)可使用 显式类型的强制转换表示法 转换,即使基类 类型不可访问

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


[emphasis added]

隐式强制转换无法编译(A是不可访问的基),第二个使用C样式强制转换,这相当于这里的
reinterpret\u cast
?是的,我们都知道,reinterpret cast是邪恶的。他在最后一行所做的不是一件好事practice@Anders:当与策略类(如
std::allocator
)结合时,私有继承是有意义的:此类类通常为空。将它们作为私有成员仍然会消耗内存,因为类的每个成员都必须有一个不同的地址,即使该成员不需要内存。然而,从他们身上继承不会消耗不必要的记忆。@Konrad:我不确定学习新东西是否是件了不起的事情,这是罕见的一次!我几乎希望我不知道,因为那样就不会有使用它的诱惑了。:-)