C++ -- 关于 "protected inheritance"的问题

标签 c++

我假设我理解“ protected 继承”的含义。但是,在和这里的一个人讨论过这个问题后,我现在感到有点困惑。

这是我对c++中“保护继承”的理解

假设以下类结构。

class Base {}
class SubClass : protected Base {}

1> 如果一个子类被定义为“protected BaseClass”,那么这个子类就不再是BaseClass的子类了。相反,BaseClass 仅用作子类的实用工具。换句话说,如果您将 SubClass* 转换为 Base*,将 SubClass& 转换为 Base&,或将 SubClass 转换为 Base,您应该会遇到错误。

2> 人们使用 protected 继承的主要原因是预期的子类不是 Base 的子类(例如,Car 不是 Engine 的子类)。同时,SubClass 想要调用 Base 类中定义的函数。

3> 有时您更喜欢使用 protected 继承而不是将成员变量定义为 Base 的对象,这是有充分理由的。 (但我不记得是哪种情况)。

如有错误,请指正。

谢谢

最佳答案

对于 1. - SubClass仍然是 Base 的子类. protected 继承仍然是继承。从 SubClass 自动转换是正确的至 Base但是,这是不可能的。

SubClass sub;
Base* base(&sub);

给予

error C2243: 'type cast' : conversion from 'SubClass *' to 'Base *' exists, but is inaccessible

对于 2. 和 3. - 人们想要这个的主要原因是隐藏 public/protected Base的成员来自 SubClass客户 . SubClass子类仍然可以看到它们。将此与 private 对比隐藏的继承Base完全来自 SubClass子类和客户 - 这也符合您在 2 的最后一句中的标准,但不允许对 Base任何其他外部使用|通过SubClass .

关于C++ -- 关于 "protected inheritance"的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4109423/

相关文章:

c++ - 预定义宏的 __FILE__、__LINE__、__func__、stringify(#) 是如何工作的?

c++ - 为什么使用预处理器 #if 语句而不是 if() else?

c++ - 现成的 C++ 十六进制转储代码

c++ - MFC MessageMap 和虚函数

c++ - 如何使用 Visual Studio C++ 编译器?

c++ - 将私有(private)库静态链接到公共(public)库以隐藏符号

c++ - 如何防止 mmap() 分配的内存空间被 'new' 调用分配?

c++ - 如果条件为单个和 (&)

C++ 整数类型是给定类型宽度的两倍

c++ - 值(value)转换与引用转换