首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么私有继承对象允许成员函数强制转换为派生的*而外部不允许?

为什么私有继承对象允许成员函数强制转换为派生的*而外部不允许?
EN

Stack Overflow用户
提问于 2019-01-23 03:44:56
回答 1查看 67关注 0票数 3

我正在检查一个关于私有继承的常见问题,我不太明白以下两个结论,有人能给出一些解释吗?

在这两种情况下,用户(局外人)都不能将汽车*转换为引擎* ?

私有继承变体允许汽车成员将汽车*转换为引擎*

私有继承是组合的语法变体(AKA聚合和/或has)。 例如,“汽车有发动机”的关系可以用简单的组合来表示: class Engine { public: Engine(int numCylinders);void ();//启动此引擎};class Car { public: Car():e_(8) {}/用8缸空启动(){ e_.start();} //启动这辆汽车,启动其引擎专用: Engine e_;// Car具有-a Engine }; “汽车有引擎”关系也可以通过私有继承来表达: 汽车类:私人发动机{ // Car有-一个发动机公开: Car():Engine(8) {} //用Engine::Start //初始化这辆汽车,使用Engine::start;//启动它的引擎}; “私人继承”与“构图”有何相似之处?这两个变体之间有几个相似之处:

  • 在这两种情况下,每个汽车对象中都包含一个引擎成员对象。
  • 在任何情况下,用户(局外人)都不能将汽车*转换为发动机*
  • 在这两种情况下,Car类都有一个start()方法,该方法在包含的Engine对象上调用start()方法。

还有几个不同之处:

  • 如果您想包含每辆车的几个引擎,则需要简单的组合变体。
  • 私有继承变体可以引入不必要的多重继承。
  • 私有继承变体允许汽车成员将汽车*转换为引擎*。
  • 私有继承变量允许访问基类的受保护成员。
  • 私有继承变体允许Car覆盖引擎的虚拟函数。
  • 私有继承变体使给Car提供一个start()方法稍微简单一些(20个字符,而不是28个字符),这个方法只需调用引擎的start()方法。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-23 03:56:27

private关键字在C++中的动机是封装 --通过隐藏有关类的详细信息,编译器可以确保其他代码(在类的代码之外)不能也因此不依赖这些细节,因此编译器可以帮助您保证将来如果/当您更改这些详细信息时,不会需要修改其他代码。

在这种情况下,如果您是通过私有继承派生您的子类,您将告诉编译器,不应该允许外部代码知道该继承。就外部代码而言,您的Car类和Engine类之间的关系并不存在(除了它们不了解的实现细节)。另一方面,作为Car类一部分的代码是“内部”代码,因此如果它想这样做,它就会了解这种关系并利用它。这样,如果您改变了关系(例如,如果您将CarVehicle而不是Engine更改为子类),您可能不得不在Car类中重写一些代码,但是您不必在其他地方修复依赖于Car子类Engine的任何其他代码,因为从一开始就不允许外部代码依赖于这种关系。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54319744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档