在派生类中使用受保护的说明符

Posted

技术标签:

【中文标题】在派生类中使用受保护的说明符【英文标题】:Use of protected specifier in a derived class 【发布时间】:2014-12-26 04:54:01 【问题描述】:

我不确定成员 var isMouseOverYard 的正确访问说明符。在 sn-p 中,我没有计划从 House 继承。选项 1 与基类更一致(如果我要从任一类继承,我可以检查鼠标是否在对象/院子上)。但是,如果我不从 House 继承,选项 2 更准确地反映了我目前的意图。有没有关于这种用法的约定?

class Object

protected:
    virtual bool isMouseOverObject() const;
;

选项 1

class House : public Object

protected:
   virtual bool isMouseOverObject() const override;
   bool isMouseOverYard() const;
;

选项 2

class House : public Object

protected:
   virtual bool isMouseOverObject() const override;

private:
   bool isMouseOverYard() const;

【问题讨论】:

这样,你的课程完全没用 @BЈовић 您希望看到整个实现,包括这个问题涉及的所有内容吗? @JorenHeit 不,我宁愿看 SCCEE (catb.org/esr/faqs/smart-questions.html) 【参考方案1】:

如果我没记错的话,至少 Bjarne Stroustroup 的约定是从不拥有受保护的数据。有时这似乎很诱人,但只通过 get/set 函数访问数据成员几乎总是更好。然后可以对这些函数进行保护,使它们对派生类可用,但对外部世界不可用。

因此,在您的情况下,我会选择选项 2,并考虑添加一些简单的 get/set 函数以备不时之需。

编辑:由于 OP 的拼写错误,我被误导认为这个问题是关于变量而不是函数的。

【讨论】:

@MichalHosala:问题中的原始代码错过了(),所以它看起来像一个数据成员。 哎呀...我扫了一眼这该死的太快了。认为 isMouseOverYard 是一个变量。我会删除我的答案。编辑:@JohnZwinck 这解释了它......【参考方案2】:

我的一般经验法则是最大程度地限制可见性。 IE。我会在 House 类中将 isMouseOverObject 设为私有。

【讨论】:

【参考方案3】:

这并不重要。我会把它留给protected,因为它在未来会更加灵活,而且无论如何它都是一个 const 方法,所以如果有人“滥用”它,也不会冒太大损坏任何东西的风险。

【讨论】:

【参考方案4】:

这两个选项都很好,选项 2 更好,因为支持方法可以是您的班级私有的,对其他人隐藏,私有地限制并且班级成员可以访问

【讨论】:

以上是关于在派生类中使用受保护的说明符的主要内容,如果未能解决你的问题,请参考以下文章

在派生类中使用来自虚拟基类的受保护 ctor

在派生类中无法访问受保护的成员?

如何影响派生类中受保护的基变量

C++ - 在派生类中静态初始化基类受保护的成员变量

访问派生类中的受保护成员

可以通过[重复]在派生类中初始化受保护的基类成员