C ++ - 关于“受保护的继承”的问题

时间:2010-11-05 19:41:13

标签: c++

我认为我理解“受保护的继承”的含义。然而,在与这里的一个人讨论这个问题之后,我现在感到有些困惑。

以下是我对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的对象,这是有充分理由的。 (但我不记得在哪种情况下)。

如果我错了,请更正我的评论。

谢谢

2 个答案:

答案 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的客户端。

正如您所指出的,您可以使用数组作为数据成员来实现堆栈。