C++抽象基类在派生类构造函数初始化列表中初始化的含义求解
这行代码的本质含义
你看到的nameA::class_a()调用,是派生类class_b的构造函数在初始化列表中显式调用抽象基类的无参构造函数,用来初始化当前class_b实例中包含的class_a基类子对象,完全符合C++语法规则。
规则说明
- 抽象类不能实例化的规则,指的是不能创建独立的、完整的抽象类对象,不管是栈声明
class_a a;还是堆分配new class_a()都是禁止的。 - 但派生类继承抽象类时,每个派生类对象内部都会包含一个抽象基类的子对象,这个子对象是派生类对象的一部分,不是独立的抽象类实例,必须通过基类构造函数完成初始化,这个行为是被C++标准允许的。
额外补充
- 你给出的
class_a只声明了虚析构函数和纯虚函数,无自定义的成员变量和带参构造函数,编译器会自动生成默认无参构造函数。就算你不在class_b的初始化列表中显式写nameA::class_a(),编译器也会自动隐式调用基类的无参构造函数,写出来只是显式标明了初始化逻辑,和隐式调用的效果完全一致。 - 注意当前你给出的代码中,
class_b还没有实现基类的纯虚函数process(),因此现在的class_b依然是抽象类,同样无法创建实例,必须实现process()之后才能正常实例化class_b。
内容的提问来源于stack exchange,提问作者dev_eng
相关产品推荐
相关产品推荐

