我不完全理解这一点:
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(),这实际上是在派生对象上完成的吗?或者还有其他原因吗?
答案 0 :(得分:18)
从对继承的共同理解来看,C ++的“私有继承”是一个可怕的误称:它是不是继承(就类的所有内容而言)而是一个完整的实现细节上课。
从外部看,私人继承实际上与构成完全相同。只有在类的内部才能获得特殊的语法,这种语法更像是继承而不是组合。
但有一点需要注意:C ++在语法上将其视为继承,具有所需的所有好处和问题,例如scope visibility and accessibility。此外,C风格的强制转换(但没有C ++强制转换!)实际上忽略了可见性,因此成功地将Derived
指针转换为Base
:
Base* bPtr = (Base*) new Derived();
毋庸置疑,这是邪恶。
答案 1 :(得分:18)
公共继承意味着每个人都知道Derived派生自Base。
受保护的继承意味着只有Derived,Derived的朋友和派生自Derived的类知道Derived是从Base派生的。*
私有继承意味着只有Derived和Derived的朋友知道Derived是从Base派生的。
由于你使用了私有继承,你的main()函数对于从base的派生没有任何线索,因此无法分配指针。
私有继承通常用于实现“is-implemented-in-terms-of”关系。一个例子可能是Base公开了一个你需要覆盖的虚函数 - 因此必须继承 - 但你不希望客户知道你有这种继承关系。
*还有:土拨鼠砍了多少木头......
答案 2 :(得分:9)
因为private
表示“实现细节”,这使得Derived
从Base
派生出一个实现细节。
私有继承不是接口继承,而是实现继承。它不实现“Is-A”关系,而是实现“Is-Implemented-Using”关系。就类的用户而言,Derived
不是Base
,它恰好(目前)使用它来实现。
答案 3 :(得分:1)
如果您私下继承任何需要从Derived *转换为Base *的代码必须是Derived类的成员或朋友。
答案 4 :(得分:1)
答案 5 :(得分:0)
使用私有继承,您将失去将派生对象视为基类对象的选项。