C++中派生类是否需要重写基类的构造函数?
关于C++派生类构造/析构函数的问题解答
不需要重写基类B的构造函数
如果派生类D没有显式声明任何构造函数,编译器会自动为D生成一个默认构造函数(无参),这个自动生成的构造函数会自动调用基类B的默认构造函数。只有当基类B没有默认构造函数(比如仅定义了带参数的构造函数)时,编译器无法为D生成合法的默认构造函数,这时才需要手动编写D的构造函数,显式调用基类的带参构造函数。不会直接使用基类的构造/析构函数,而是编译器自动生成派生类的对应函数
当D中不声明构造函数、析构函数时,编译器会根据规则自动生成D的默认构造、拷贝构造、移动构造(C++11及以后)、析构函数等。这些自动生成的函数会在执行时调用基类B的对应成员函数。比如自动生成的D的析构函数会调用B的析构函数;如果基类B的析构函数是虚函数,那么D自动生成的析构函数也会是虚函数。自动生成默认成员函数的核心行为从C++98开始支持
C98就已经规定了编译器会为未声明构造函数的类生成默认构造函数,且自动调用基类的默认构造。C11在此基础上扩展了自动生成的函数类型(比如移动构造、移动赋值运算符),但你问题中涉及的核心行为(不声明构造则自动调用基类构造)在C++98标准中就已经存在。
代码示例
- 基类有默认构造的情况(无需手动写D的构造)
class B { public: B() { /* 基类默认构造 */ } virtual void func() { /* 基类方法 */ } virtual ~B() {} // 建议基类析构设为虚函数 }; class D : public B { public: void func() override { /* 重写基类方法 */ } // 编译器自动生成默认构造,自动调用B::B() };
- 基类只有带参构造的情况(必须手动写D的构造)
class B { public: B(int x) { /* 基类带参构造 */ } }; class D : public B { public: D(int x) : B(x) {} // 必须显式调用基类构造,否则编译失败 void func() override {} };
内容的提问来源于stack exchange,提问作者TSG
相关产品推荐
相关产品推荐

