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

时间:2014-02-07 09:44:02

标签: c++ class oop inheritance multiple-inheritance

我在下面使用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. 虚拟解构函数能否在多层继承情况下运行良好?

3 个答案:

答案 0 :(得分:5)

您可能需要转移到has-a关系,其中connect_info可以是内部class(班级内的班级)并将其设为private,如果您愿意隐藏connect_info中的user defined class成员。

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.
};

答案 1 :(得分:1)

继承引入了类之间的强耦合,通常可以避免。相反,人们正在使用构图。阅读Prefer composition over inheritance问题和答案。

在您的具体示例中,当您添加algo_B_vertex类时,您做了什么,其中Vertex中的某些字段和方法毫无意义。或者在更糟糕的情况下connect_info。然后你会遇到各种各样的问题。更不用说几层继承的复杂性。

  

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

通过使用合成,并在私有部分创建对象。

  

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

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

答案 2 :(得分:0)

这里的良好交易是让vertex私下从connect_info继承。与作文的最大区别在于,在课程vertex中,您可以将自己视为connect_info,这意味着您可以通过执行these members代替this->member来访问connect_info_attribute.member {1}}。此外,您不需要任何friend或封装黑客。

总而言之,从儿童班的角度来看,private继承意味着我认为自己是“父母”但我不希望任何其他人(甚至我的孩子)都不能考虑我像一个人。