Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 组合继承_C++_Inheritance_Class Design_Composition - Fatal编程技术网

C++ 组合继承

C++ 组合继承,c++,inheritance,class-design,composition,C++,Inheritance,Class Design,Composition,我正在设计一个系统,我还没有实现,首先我只是绘制它的图表,然后将对它进行编码,我想问一个简单的问题: 当我们同时使用继承和组合时该怎么办 例如,在一家酒店里,我们可以说有两种房间:标准间和双人房。为此,我可以使用继承概念,这两种房间将是派生类,但我也可以使用组合,将标准房间和双人房间分开,然后使用这是我的酒店类 我该怎么办?在您的站点上,我会在room类上设置room\u type属性,并将room\u type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN 只要这种类型的字段没

我正在设计一个系统,我还没有实现,首先我只是绘制它的图表,然后将对它进行编码,我想问一个简单的问题:

当我们同时使用继承和组合时该怎么办

例如,在一家酒店里,我们可以说有两种房间:标准间和双人房。为此,我可以使用继承概念,这两种房间将是派生类,但我也可以使用组合,将标准房间和双人房间分开,然后使用这是我的酒店类


我该怎么办?

在您的站点上,我会在room类上设置room\u type属性,并将room\u type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN

只要这种类型的字段没有显著的行为差异,我会保持简单


如果有复杂的行为,比如根据床位数量预测清理、更改定价等等,我会使用抽象基类CRoom,并从中继承CStdRoom和CTwinRoom,可能会在类构造函数中设置一个常量num of beds属性。

I在您的站点中,我将在room类上有一个room_type属性,并将room_type属性的类型设置为枚举类型,可能的值为STANDARD和TWIN

只要这种类型的字段没有显著的行为差异,我会保持简单


如果有复杂的行为,比如根据床位数量预测清理、改变价格等等,我会使用抽象基类CRoom,并从中继承CStdRoom和CTwinRoom,可能在类构造函数中设置一个常量num of beds属性。

这个问题有点模糊,缺少很多细节,但我将分享一些想法

第一件事:在设计应用程序时,最重要的是需求

您需要首先尝试识别在系统中具有某种意义的实体。假设你知道会有旅馆和房间。请注意,此关系已经是一个组合,主要原因是:

  • 房间只能是一家酒店的一部分,不能在多家酒店之间共享
  • 一旦酒店被毁,里面所有的房间都会被毁
在C++中,构图通常是指“按值”,即<代码>类酒店<代码>可以有<代码>房间;code>这将是一个具有自动存储持续时间的对象,其生存期与
Hotel
实例的生存期相关联,对于多个房间,您只需将它们放入向量即可产生相同的关系:

class Room { ... };

class Hotel {
public:
    std::vector<Room> rooms;
};
教室{…};
一流酒店{
公众:
病媒室;
};
(顺便说一句,聚合最有可能由指针或引用表示)。这是另一个很好的组合示例:


如果你知道会有不同种类的房间,第一个问题应该是:这些物体会有不同的行为吗?我的系统会以不同的方式对待他们吗。。。也许你不需要追求比房间更细的粒度,一个具体房间的所有属性都会用它的属性来表达——大小、床的数量,也许几十个布尔“has”标志(“has aircon”、“has TV”、“has microwave”…),也许它的所有属性都可以用简单的“type”来表达,您将在
enum

中输入的值这个问题有点模糊,缺少很多细节,但我将与大家分享一些想法

第一件事:在设计应用程序时,最重要的是需求

您需要首先尝试识别在系统中具有某种意义的实体。假设你知道会有旅馆和房间。请注意,此关系已经是一个组合,主要原因是:

  • 房间只能是一家酒店的一部分,不能在多家酒店之间共享
  • 一旦酒店被毁,里面所有的房间都会被毁
在C++中,构图通常是指“按值”,即<代码>类酒店<代码>可以有<代码>房间;code>这将是一个具有自动存储持续时间的对象,其生存期与
Hotel
实例的生存期相关联,对于多个房间,您只需将它们放入向量即可产生相同的关系:

class Room { ... };

class Hotel {
public:
    std::vector<Room> rooms;
};
教室{…};
一流酒店{
公众:
病媒室;
};
(顺便说一句,聚合最有可能由指针或引用表示)。这是另一个很好的组合示例:


如果你知道会有不同种类的房间,第一个问题应该是:这些物体会有不同的行为吗?我的系统会以不同的方式对待他们吗。。。也许你不需要追求比房间更细的粒度,一个具体房间的所有属性都会用它的属性来表达——大小、床的数量,也许几十个布尔“has”标志(“has aircon”、“has TV”、“has microwave”…),也许它的所有属性都可以用简单的“type”来表达,您将放入
enum

的值不应使用语言继承来建模业务需求继承。这使得修改或扩展业务模型变得太难了。语言继承用于实现模型的功能,而不是模型本身

相反,从“业务对象”或类似对象派生所有对象,以封装常见的内部行为,如序列化。类可以有类型,也可以使用typeinfo,或者可以使用显式类型字段。无论哪种方式,对象之间的链接,无论是类继承还是类组合,都应该是指针(或索引id字段)和集合(指针或索引id)。[您的代码片段很好,但指针会使内存管理复杂化,其中包含整数ID