我不完全理解这一点:
class Base
{
public:
Base()
{
cout<<"Base" << endl;
}
virtual void call()
{
cout<<"Base call" << endl;
}
};
class Derived: private Base
{
public:
Derived()
{
cout<<"Derived" << endl;
}
};
int main(void)
{
Base *bPtr = new Derived(); // This is not allowed
}是否因为有人可能会使用bPtr调用call(),而这实际上是在派生对象上完成的?或者还有其他原因吗?
发布于 2009-10-16 09:11:14
从对继承的普遍理解来看,C++的“私有继承”是一个可怕的用词不当:它不是继承(就类之外的一切而言),而是类的完整实现细节。
从外部看,私有继承实际上与组合几乎相同。只有在类的内部,你才能得到特殊的语法,这种语法更像是继承而不是组合。
但有一个警告: C++在语法上将其视为继承,并具有由此带来的所有好处和问题,例如scope visibility and accessibility。此外,C风格的强制转换(但没有C++强制转换!)实际上忽略了可见性,因此成功地将Derived指针强制转换为Base
Base* bPtr = (Base*) new Derived();不用说,这是邪恶的。
发布于 2009-10-16 10:27:39
公共继承意味着每个人都知道派生是从Base派生的。
受保护的继承意味着只有派生的、派生的朋友和派生的类知道派生是从基础派生的。*
私有继承意味着只有派生的和派生的朋友知道派生是从Base派生的。
因为你已经使用了私有继承,你的main()函数不知道从base派生,因此不能赋值指针。
私有继承通常用于实现“is -implemented-in-terms of”关系。一个例子可能是Base公开了一个您需要覆盖的虚函数--因此必须继承自它--但是您不想让客户端知道您有这种继承关系。
*还有:一只土拨鼠能扔多少木头...
发布于 2009-10-16 10:16:53
因为private的意思是“实现细节”,这使得Derived派生自Base这一事实成为实现细节。
私有继承不是接口继承,而是实现继承。它不实现"Is-A“关系,而是"Is-Implemented-Using”关系。对于类的用户而言,Derived不是Base,它只是碰巧(目前)使用它实现的。
https://stackoverflow.com/questions/1576978
复制相似问题