C++继承类与创建成员的区别

4

假设我有一个包含多个方法的类。我想将其分成多个类。我可以继承这些类,或者可以创建包含这些类的成员变量。哪种方法更有效和可用?

假设我有以下类:

class ClassRoom {
    vector<int> BoysIds;
    vector<int> GirlsIds;
public:
    void RegisterBoy(int i);
    void RegisterGirl(int i);
    int GetTotalBoys();
    int GetTotalGirls();
};

我已将其分为多个类,如下所示:
class Boys {
    vector<int> BoysIds;
public:
    void RegisterBoy(int i);
    int GetTotalBoys();
};

class Girls {
    vector<int> GirlsIds;
public:
void RegisterGirl(int i);
int GetTotalGirls();
};

继承一个类更有效率吗?
class ClassRoom : public Boys, public Girls {
};

创建成员更有效率?
class ClassRoom {
public:
    Boys m_boys;
    Girls m_girls;
};

对你来说,“高效”是什么意思?有没有什么阻止你尝试所有替代方案,然后确定哪个更“高效”,并使用你所认为重要的“高效”的定义? - Sam Varshavchik
继承一个类更有效率吗?一切都是权衡取舍,在不知道你正在优化什么的情况下,无法确定哪种方法更有效率(时间?空间?复杂度?可维护性?表达能力?巧妙程度?)。在类级别上区分男孩和女孩的需求乍一看有点令人担忧,我最多只会允许自己使用“学生”。 - Dmytro
这要看情况。从设计的角度来看,继承(至少是public继承)代表“是一种”的关系(例如,狗是动物,所以类Dog可以继承自Animal),而聚合(成员关系)代表类之间的所有权或关联关系(例如,Car可能包含一个SteeringWheel,并且有一个指向Owner的指针(因为汽车通常与所有者相关联,但所有者并不是汽车的一部分)。当成员关系更符合设计时使用继承往往会使您的代码更难理解,也更难正确实现。 - Peter
1个回答

3
多重继承和成员都很有效。然而,除非您有充分的理由,否则在这里使用成员比多重继承更好的风格。仅仅将类分离开,没有其他充分理由,可能不是使用多重继承的好理由。
作为一般规则,除非您有使用多重继承的充分理由,否则应避免使用它。
此外,在最近几十年中,具有成员(您的类“has-a” Boys 和 Girls)比继承(您的类“is-a” Boys 和 Girls)更受欢迎,除非有充分的理由进行更改。
您仍然可以将成员分为单独的类,而不使用多重继承。但是,如果您想在单独的类中定义公共方法,您需要手动转发它们。

此外,我想建议或许 OP 想要一个 Gender 枚举,然后是一个包装向量并具有基于该枚举的性别标志的 GenderGroup 类。 boys_groupgirls_group 可以只是 GenderGroup 的实例。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接