在派生类中使用受保护的说明符
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 更好,因为支持方法可以是您的班级私有的,对其他人隐藏,私有地限制并且班级成员可以访问
【讨论】:
以上是关于在派生类中使用受保护的说明符的主要内容,如果未能解决你的问题,请参考以下文章