- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在阅读 Scott Meyers 的 Effective C++(第三版),并在 第 32 项:确保公共(public)继承是页面上的“is-a” 中的一段中151 他发表评论(我用粗体表示):
This is true only for public inheritance. C++ will behave as I've described only if Student is publicly derived from Person. Private inheritance means something entirely different (see Item 39), and protected inheritance is something whose meaning eludes me to this day.
问题:我应该如何解释这条评论? Meyers 是否试图传达 protected 继承很少被认为有用并且应该避免?
(我已阅读问题 Difference between private, public, and protected inheritance以及 C++ FAQ Lite's private and protected inheritance section ,两者都解释了 protected 继承的含义,但并没有让我深入了解它何时或为什么有用。)
最佳答案
您想要保护的一些场景:
您有一个基类,其中包含您知道永远不想将功能公开到外部的方法,但您知道它对任何派生类都有用。
你有一个基类,它的成员应该被任何扩展该类的类在逻辑上使用,但绝不应该暴露在外面。
多亏了多重继承,您可以使用基类的继承类型,并使用现有的逻辑和实现构造一个更加多样化的类。
一个更具体的例子:
您可以创建一些遵循设计模式逻辑的抽象类,假设您有:
Observer
Subject
Factory
现在您希望将这些全部公开,因为一般来说,您可以在任何东西上使用该模式。
但是,使用 protected 继承,您可以创建一个观察者和主题的类,但只有 protected 工厂,因此工厂部分仅用于继承的类。 (只是为示例选择了随机模式)
另一个例子:
例如,假设您想从库类继承(我不鼓励这样做)。假设您想制作自己的 std::list<>
的酷扩展或“更好”shared_ptr
.
您可以从基类(设计为具有公共(public)方法) protected 地派生。
这将使您可以选择使用自己的自定义方法、使用类的逻辑并将逻辑传递给任何派生类。
您或许可以改用封装,但继承遵循 IS A 的正确逻辑 (或者在这种情况下是一种 A)
关于c++ - 有效 C++ : discouraging protected inheritance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484306/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!