【问题标题】:Accessing base class elements without breaking encapsulation在不破坏封装的情况下访问基类元素
【发布时间】:2016-06-08 11:19:02
【问题描述】:

我创建了两个类 A 和 B,其中 B 继承自类 A。如您所见,我在类 A 中有一个向量,该向量当前位于该类的受保护部分下。我不确定使用 protected 是否是不好的做法?

#include <vector>

class A
{
public :
   A();
protected:
   std::vector <std::string> a;
};

class B : A
{
public :
   B();
void accessVector()
{
    a.size();
}
private:

};

【问题讨论】:

  • 完全取决于您的设计,这有时是完全有效和有用的。 protected 关键字的存在是有原因的。
  • “我不确定使用受保护的做法是否不好?” 是否不好取决于(语义)上下文。
  • 一般情况下,当您不希望类(基类或派生类)的对象/实例访问这些成员时,您可以保护成员。但这在朋友班的情况下会被打破。

标签: c++ class inheritance base


【解决方案1】:

当A 使数据成员a 受保护时,它为从它派生的所有类提供以下保证:

“你可以在不告诉我的情况下对a 做任何你想做的事情。这包括附加到它、修改它的内容、删除项目、对其进行排序、从它移动、移动到它以及以其他方式使其状态未定义和/或我不知道”。

请记住,任何人都可以创建派生自 A 的类。

出于这个原因,就所有意图和目的而言,受保护的成员是公共成员,因为派生类可以简单地说如下:

public:
using A::a;

从这里开始并继续工作,您会发现protected 只有两个合理的用例:

  • 当基类定义了可能需要从派生类中相同函数的重写版本调用的虚拟成员函数时。

  • 当基类想要将“数据作为接口”公开给派生类,而不是公开时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2018-05-09
    • 1970-01-01
    • 2014-08-22
    • 2019-06-27
    相关资源
    最近更新 更多