首页 > 解决方案 > 纯数据结构的组合与继承

问题描述

因此,有许多规则需要遵循,例如 C++ 的“组合优于继承”。但是,这通常是指接口。这里的接口是指“具有一些公共方法的类”。

但是只是简单的数据结构呢?例子:

template<typename A, typename B, typename C>
struct some_named_data
{
    A a;
    B b;
    C c;
};

struct has_those_data_as_a_member
{
    some_named_data<int, double, char> snd;
    // some more data and probably a few public methods
};

struct has_those_data_fields_inherited : public some_named_data<int, double, char>
{
    // some more data and probably a few public methods
};

这两种方式在设计实践方面有什么不同,还是只是品味问题?

我的想法:

  1. 对于继承,很容易编写 type_traits,如果我想用
template<typename T>
std::is_base_of_v<some_named_data, T> // this goes somewhere

因为组合可能可以通过 c++20 概念以某种方式完成,不确定。

  1. 还有一个名字——可以是好是坏
has_those_data_as_a_member memb;
memb.snd.a = 5; // one more name

has_those_data_fields_inherited inh;
inh.a = 5; // one less name
  1. 如果继承的是类模板本身,有时需要写this->a访问成员,这很烦人,但也有点烦人。

所以,除此之外,我看不出一个或另一个有任何特别的优点/缺点。内存布局应该是相同的(我猜?)。两者在这里看起来都像是对“具有”关系的建模(因为没有私有不变量,没有方法)。

那么,这个案例在内部结构和设计实践方面是否有任何具体差异?

谢谢!

标签: c++inheritancestructcomposition

解决方案


推荐阅读