我正在检查一个关于私有继承的常见问题,我不太明白以下两个结论,有人能给出一些解释吗?
在这两种情况下,用户(局外人)都不能将汽车*转换为引擎* ?
私有继承变体允许汽车成员将汽车*转换为引擎*。
私有继承是组合的语法变体(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;//启动它的引擎}; “私人继承”与“构图”有何相似之处?这两个变体之间有几个相似之处:
还有几个不同之处:
发布于 2019-01-23 03:56:27
private
关键字在C++中的动机是封装 --通过隐藏有关类的详细信息,编译器可以确保其他代码(在类的代码之外)不能也因此不依赖这些细节,因此编译器可以帮助您保证将来如果/当您更改这些详细信息时,不会需要修改其他代码。
在这种情况下,如果您是通过私有继承派生您的子类,您将告诉编译器,不应该允许外部代码知道该继承。就外部代码而言,您的Car
类和Engine
类之间的关系并不存在(除了它们不了解的实现细节)。另一方面,作为Car
类一部分的代码是“内部”代码,因此如果它想这样做,它就会了解这种关系并利用它。这样,如果您改变了关系(例如,如果您将Car
从Vehicle
而不是Engine
更改为子类),您可能不得不在Car
类中重写一些代码,但是您不必在其他地方修复依赖于Car
子类Engine
的任何其他代码,因为从一开始就不允许外部代码依赖于这种关系。
https://stackoverflow.com/questions/54319744
复制相似问题