c++ - 纯数据结构的组合与继承
问题描述
因此,有许多规则需要遵循,例如 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
};
这两种方式在设计实践方面有什么不同,还是只是品味问题?
我的想法:
- 对于继承,很容易编写 type_traits,如果我想用
template<typename T>
std::is_base_of_v<some_named_data, T> // this goes somewhere
因为组合可能可以通过 c++20 概念以某种方式完成,不确定。
- 还有一个名字——可以是好是坏
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
- 如果继承的是类模板本身,有时需要写
this->a
访问成员,这很烦人,但也有点烦人。
所以,除此之外,我看不出一个或另一个有任何特别的优点/缺点。内存布局应该是相同的(我猜?)。两者在这里看起来都像是对“具有”关系的建模(因为没有私有不变量,没有方法)。
那么,这个案例在内部结构和设计实践方面是否有任何具体差异?
谢谢!
解决方案
推荐阅读
- netty - 禁用 HttpClientCodec 以添加和编码附加数据
- python - 在 matplotlib 中并排绘制条形图上的多个字符串值
- python-3.x - 带有 websockets 的 Tornado 协程不适用于 python3
- powerbi - 使用来自 Azure 分析服务的表上的 DAX 函数创建度量
- powershell - 如果 PC 名称与 AD 组中的 PC 名称匹配,则执行特定操作
- c# - 为什么 List<>.Add 来自多个线程会导致不同的结果?
- spring - 条件为 SpringBatch 的处理器
- cobalt - 如何将 JS 引擎从 SpiderMonkey 切换到 V8
- c++ - C++ 多继承访问修饰符
- ruby-on-rails - 关于可以具有不同父类的资源的控制器的最佳实践