多层继承在C 中是否有意义

Does multi-layer inheritance make sense in C++?

本文关键字:是否 有意义 继承      更新时间:2023-10-16

我在下面使用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)。

问题在这里生成:

  1. 如何将这些成员隐藏在用户定义的类中?(protectedprivate现在都没有用。如果没有connect_info基类,private可以很好地工作)
  2. 在任何情况下,多层继承设计是否有意义?
  3. 虚拟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。然后,您会陷入各种问题。更不用说几层继承的复杂性。

如何将这些成员隐藏在用户定义的类中?

使用构图,并在私有部分中创建对象。

多层继承设计在任何情况下是否有意义?

当然可以。幸运的是,这种情况很少。一般建议是在跳入多种继承之前三思而后行。

这里的良好用户是使vertexconnect_info私下继承。与构图的最大区别在于,在vertex类中,您可以认为自己是connect_info,这意味着您可以通过执行this->member而不是connect_info_attribute.member访问these members。另外,您不需要任何friend或封装黑客。

从孩子班的角度来看, private的继承意味着我认为自己是"父母",但我不希望其他任何人(甚至我的孩子都没有)像一个人一样考虑我。<<<<<<