我在下面使用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
可以正常使用)答案 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
继承意味着我认为自己是“父母”但我不希望任何其他人(甚至我的孩子)都不能考虑我像一个人。