我认为我理解“受保护的继承”的含义。然而,在与这里的一个人讨论这个问题之后,我现在感到有些困惑。
以下是我对c ++中“受保护的继承”的理解
假设以下类结构。
class Base {}
class SubClass : protected Base {}
1>如果子类被定义为“受保护的BaseClass”,则该子类不再是BaseClass的子类。相反,BaseClass仅用作子类的实用工具。换句话说,如果你将SubClass *转换为Base *,SubClass&对于Base&或SubClass到Base,您应该会遇到错误。
2 - ;人们使用受保护继承的主要原因是预期的SubClass不是Base的子类(例如,Car不是Engine的子类)。而在同一时间,SubClass想要调用Base类中定义的函数。
3>有时您更喜欢使用受保护的继承而不是将成员变量定义为Base的对象,这是有充分理由的。 (但我不记得在哪种情况下)。
如果我错了,请更正我的评论。
谢谢
答案 0 :(得分:4)
对于1. - SubClass
仍然是Base
的子类。受保护的继承仍然是继承。不过,您无法自动从SubClass
转换为Base
。
SubClass sub;
Base* base(&sub);
给出
错误C2243:'type cast':转换 从'SubClass *'到'Base *'存在, 但是无法进入
对于2.和3. - 人们想要这样做的主要原因是隐藏public/protected
Base
SubClass
成员来自SubClass
的客户。 private
的子类仍可以看到它们。将此与Base
继承进行对比,后者SubClass
完全隐藏Base
的子类和客户 - 这也符合您在2的最后一句中的标准,但不允许通过SubClass
对{{1}}进行的任何其他外部使用。
答案 1 :(得分:0)
您可能已经从OO讨论中听到过这些术语,IS-A(公共继承)HAS-A(包含)。我听说这个术语是为了保护或私有继承“IMPLEMENTED-AS-A”。例如,您可以实现Stack类AS-AN数组,但是您不希望将Array的公共方法暴露给Stack的客户端。
正如您所指出的,您可以使用数组作为数据成员来实现堆栈。