不是必须写 Parent(),但绝大多数情况下必须显式调用父类构造函数;若父类无默认构造函数或需传参,须在初始化列表中用 Parent(arg) 调用,不可在函数体内调用。

子类构造函数里必须显式调用父类构造函数吗?
不是必须写 Parent(),但绝大多数情况下你得写——C++ 不会自动帮你选参数,更不会自动转发参数。如果父类只有无参构造函数,且子类构造函数也没定义任何参数,编译器会隐式调用 Parent();但只要父类没有默认构造函数,或者你想传特定参数,就必须在初始化列表里显式调用。
怎么在初始化列表中调用带参的父类构造函数?
语法固定:冒号后、成员初始化之前,用 Parent(arg1, arg2)。注意不能放在函数体里(即大括号内),那会被当成普通函数调用,编译直接报错。
常见错误现象:error: constructor for 'Child' must explicitly initialize the base class 'Parent'
- 父类
Parent有带参构造函数且没定义默认构造函数 → 子类必须显式调用 - 子类构造函数参数要转发给父类 → 直接在初始化列表里用同名参数,比如
Child(int x) : Parent(x) {} - 多个基类或含成员对象时,调用顺序按类声明顺序,不是初始化列表书写顺序
继承链中多级父类构造函数怎么触发?
只在直接子类的初始化列表里调用**直接父类**构造函数即可。C++ 会自动向上逐层调用,不需要、也不能在孙子类里跳过父类去调用祖父类的构造函数。
立即学习“C++免费学习笔记(深入)”;
例如:GrandChild 继承 Child,Child 继承 Parent,那么 GrandChild 的初始化列表只需写 Child(...),Parent 的构造由 Child 的实现决定。
容易踩的坑:GrandChild() : Parent(42) {} 是非法的,编译不过 —— 不能绕过直接父类。
虚继承下父类构造函数谁来调用?
最派生类(most derived class)负责调用虚基类的构造函数,不管中间隔了几层。这是关键区别。
比如 A 虚继承自 V,B 也虚继承自 V,C 继承 A 和 B,那么只有 C 的构造函数初始化列表可以(且通常必须)调用 V(...);A 和 B 即使写了 V(...) 也会被忽略(除非 C 没调用,此时才启用就近原则,但行为不可靠)。
性能影响:虚继承本身带来指针间接寻址开销;构造逻辑变复杂,调试时容易漏掉最派生类对虚基类的调用,导致未定义行为。
最常被忽略的一点:即使父类构造函数是 protected 或 private,只要子类是友元或继承关系合法,初始化列表里的调用依然有效;但若父类构造函数是 deleted,哪怕子类想绕也绕不开编译错误。


















