gpt4 book ai didi

c++ - 对继承和访问级别的困惑

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:22 25 4
gpt4 key购买 nike

我对 C++ 继承中的访问级别以及更普遍的应该如何设计 C++ 类感到困惑。

class Car
{
public:

private:
string brandName;
}

class Sedan: public Car
{
public:
// this function needs to know the Sedan's brandName
void someFun()
{
brandName = "sss"; // error!!!
}
private:
}

在上面的例子中,作为基类的 Car 有一个私有(private)成员“brandName”,而作为 Car 派生类的 Sedan 继承了该成员“brandName”。正如 Effective C++ 中所解释的,公共(public)继承建立了一种“is-a”关系,这意味着 Sedan 是一辆汽车,现在我可以说 Sedan 有一个“brandName”吗?如果答案是肯定的,为什么 Sedan 不能在 someFun 中访问它自己的属性?

我知道解决方案是将 brandName 的访问级别更改为 protected ,我的困惑是什么功能或条件使可变成员具有哪个访问级别,换句话说,我如何决定给定成员应附加到哪个访问级别?

如果您能推荐任何详细阐述该主题的书籍或文章,我也很乐意。

最佳答案

now can I say that Sedan has a "brandName"?

不,Car 也没有。 brandName 是一个实现细节,是私有(private)的,对任何其他人都是隐藏的,并且不会对类的公共(public)接口(interface)做出贡献,这就是 Car 的本质。因此,虽然从技术上讲,汽车中某处有品牌名称,因此在轿车中也有品牌名称,但从纯 OO 的角度来看,这无关紧要。与仅由公共(public) 继承而非私有(private)继承表示的“Is-A”关系类似,OO 观点中的“Has-A”关系仅在组合或关联时存在可公开访问/可见(主要通过 getter/setter)。

juanchopanza 的回答和对它的评论让我偷偷摸摸地浏览了一下网络,试图找到关于 Is-A 和 Has-An 关系的资源。 this转录似乎表明这两个术语并非源自 OO 思想。事实上,OO 文献似乎引用了 Liskov 替换原则,而不是使用“Is-A”关系。它强调封装和不透明对象,因此它主要关注类的公共(public)接口(interface)及其行为如何影响关联 对象。 “Has-A”关系可以是关联,也可以是聚合。在这种情况下,由于 brandName 不是外部关联对象(在 C++ 中,我们会用指针或引用成员来表达这一事实),它是一个聚合 - “Has-A”,隐藏在不透明的 Car,因此 OO 不感兴趣(并且上面的答案在语义上是有效的)。

I know the solution is to change brandName's access level to protected

不! brandName 的访问级别必须保持私有(private),以便 Car 可以完全控制发生在它身上的事情。如果您想在派生类中访问它,请提供 protected getter 和/或 setter。

I'd also like it if you'd recommend any book or article elaborating on this topic.

任何关于面向对象设计的书都应该可以。如果您通读其中的两篇或更多篇文章,您将清楚地知道什么该做,什么不该做。

关于c++ - 对继承和访问级别的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18328168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com