多层级继承构建树状结构,遵循单继承规则、根到叶构造/叶到根析构、虚函数沿树动态绑定、虚继承解决菱形问题,设计宜控制在三层内。
多层级继承在C++中是通过类之间的逐级派生构建的树状结构,顶层是基类,下层是逐级派生出的子类,形成父子、祖孙等关系。理解这个结构的关键不是记住语法,而是看清“谁继承谁”“虚函数如何传递”“构造/析构顺序怎么走”,以及“菱形继承怎么破”。
每个派生类只能有一个直接父类(单继承),但可以有多个间接祖先;一个基类可被多个类同时继承,从而形成分支。整个结构天然是一棵树(非图),根节点是最终的基类,叶子节点是不再被继承的类。
s E : public A {} 合法,此时 A 是 D 和 E 的共同根对象创建时,构造函数严格按继承树从根到叶调用:先调最顶层基类,再逐级向下;析构则完全逆序——从最末级派生类开始,回溯到根类。这个顺序不可干预,由编译器保证。
虚函数表(vtable)按继承树逐层生成。只要基类声明了 virtual 函数,所有派生类(无论几级)都会继承该虚函数入口,并可选择重写。调用时根据对象实际类型(运行时类型),沿着树向上查找最近的重写版本。
当两个派生类都继承自同一基类,而第三个类又同时继承这两个派生类时,就会出现“菱形”结构,导致基类被重复继承两次。解决方式是让中间层使用 virtual 继承,使最终派生类中只保留一份基类子对象。
基本上就这些。继承树不是越深越好,三层以内较易维护;超过四层建议重新审视设计——是不是该用组合替代继承,或者提取共性为新中间层。树要清晰,别打结。