多层继承在C 中是否有意义
Does multi-layer inheritance make sense in C++?
我在下面使用3层继承设计:
class connect_info {
// these members
};
class vertex : public connect_info {
// ...
};
// user-defined struct
class algo_vertex: public vertex {
// ...
};
connect_info
类的成员(我在此问题中称其为these members
)仅在vertex
类中使用。但是要使vertex
类的语义清晰,我必须将these members
分开到另一个基类(connect_info
)。
问题在这里生成:
- 如何将这些成员隐藏在用户定义的类中?(
protected
和private
现在都没有用。如果没有connect_info
基类,private
可以很好地工作) - 在任何情况下,多层继承设计是否有意义?
- 虚拟de-constructor函数可以在多层继承情况下效果很好吗?
您可能需要移动到has-a
关系,如果您想在user defined class
中隐藏connect_info
成员,则connect_info
可以是内部class
(类中的类)并将其制成private
。
class vertex {
// ...
private:
class connect_info{/*these members*/};
};
class algo_vertex : public vertex{
// connect_info members no longer accessible,
// unless you provide member functions in `vertex` to access it.
};
继承是在类之间引入强耦合,并且通常可以避免。相反,人们正在使用构图。阅读比继承问题和答案更喜欢组成。
在您的特定示例中,当您添加algo_B_vertex
类时,您会做什么,其中Vertex
中的某些字段和方法毫无意义。或更糟糕的情况下,connect_info
。然后,您会陷入各种问题。更不用说几层继承的复杂性。
如何将这些成员隐藏在用户定义的类中?
使用构图,并在私有部分中创建对象。
多层继承设计在任何情况下是否有意义?
当然可以。幸运的是,这种情况很少。一般建议是在跳入多种继承之前三思而后行。
这里的良好用户是使vertex
从connect_info
私下继承。与构图的最大区别在于,在vertex
类中,您可以认为自己是connect_info
,这意味着您可以通过执行this->member
而不是connect_info_attribute.member
访问these members
。另外,您不需要任何friend
或封装黑客。
从孩子班的角度来看, private
的继承意味着我认为自己是"父母",但我不希望其他任何人(甚至我的孩子都没有)像一个人一样考虑我。<<<<<<
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 从头开始为应用程序创建 docker 映像是否有意义?
- 插入向量时,使用lambda的返回而不是函数的返回是否有意义?
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 左移负整数为零是否有意义?
- 将可选与reference_wrapper相结合是否有意义?
- 函数返回rvalue参考是否有意义
- 将 [[noreturn]] 添加到主函数是否有意义
- 在shared_ptr的自定义删除器中检查 nullptr 是否有意义?
- 拥有一个没有构造函数的类是否有意义
- 这是否有意义,我的计算机只能并行运行4个线程
- constexpr移动构造函数是否有意义
- 为赋值编写伪代码,并希望仔细检查它是否有意义
- 在目标平台上编译 Boost 自己是否有意义
- 多层继承在C 中是否有意义
- 从 STL 容器继承并删除"新"运算符以防止由于缺少虚拟析构函数而导致未定义的行为是否有意义?
- 一元运算符关联是否有意义
- 为工厂创建一个抽象工厂是否有意义
- 返回对数组的引用是否有意义