You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中派生类是否需要重写基类的构造函数?

关于C++派生类构造/析构函数的问题解答
  • 不需要重写基类B的构造函数
    如果派生类D没有显式声明任何构造函数,编译器会自动为D生成一个默认构造函数(无参),这个自动生成的构造函数会自动调用基类B的默认构造函数。只有当基类B没有默认构造函数(比如仅定义了带参数的构造函数)时,编译器无法为D生成合法的默认构造函数,这时才需要手动编写D的构造函数,显式调用基类的带参构造函数。

  • 不会直接使用基类的构造/析构函数,而是编译器自动生成派生类的对应函数
    当D中不声明构造函数、析构函数时,编译器会根据规则自动生成D的默认构造、拷贝构造、移动构造(C++11及以后)、析构函数等。这些自动生成的函数会在执行时调用基类B的对应成员函数。比如自动生成的D的析构函数会调用B的析构函数;如果基类B的析构函数是虚函数,那么D自动生成的析构函数也会是虚函数。

  • 自动生成默认成员函数的核心行为从C++98开始支持
    C98就已经规定了编译器会为未声明构造函数的类生成默认构造函数,且自动调用基类的默认构造。C11在此基础上扩展了自动生成的函数类型(比如移动构造、移动赋值运算符),但你问题中涉及的核心行为(不声明构造则自动调用基类构造)在C++98标准中就已经存在。

代码示例

  1. 基类有默认构造的情况(无需手动写D的构造)
class B {
public:
    B() { /* 基类默认构造 */ }
    virtual void func() { /* 基类方法 */ }
    virtual ~B() {} // 建议基类析构设为虚函数
};

class D : public B {
public:
    void func() override { /* 重写基类方法 */ }
    // 编译器自动生成默认构造,自动调用B::B()
};
  1. 基类只有带参构造的情况(必须手动写D的构造)
class B {
public:
    B(int x) { /* 基类带参构造 */ }
};

class D : public B {
public:
    D(int x) : B(x) {} // 必须显式调用基类构造,否则编译失败
    void func() override {}
};

内容的提问来源于stack exchange,提问作者TSG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:33:22