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

如何使用委托构造函数从派生类调用基类构造函数?

派生类委托构造函数调用基类构造函数的问题解决

问题描述

编写派生类构造函数时,尝试同时委托同类型构造函数并调用基类构造函数,触发编译错误:A delegating constructor cannot have other mem-initializers。需求是:调用基类构造函数将Base的value成员初始化为1000,同时将Derived的testing_value和doubled_value成员分别初始化为1000和2000。

错误原因

C++标准规定:委托构造函数(即通过类名{参数}形式调用同类其他构造函数的构造函数)的初始化列表中,只能存在委托项,不能同时包含基类初始化、成员变量初始化等其他初始化条目。原代码中Derived(int testing_val)同时写了Base{testing_val}和Derived{testing_val, 0},违反了这一规则。

解决方案

调整构造函数的职责划分:让负责初始化成员变量的构造函数同时完成基类的初始化,其他构造函数仅通过委托传递参数即可。

修正后的完整代码

#include <iostream>
using namespace std;

class Base
{
private:
    int value;

public:
    Base() : value{0}
    {
        cout << "Base no args constructor called" << endl;
    }
    Base(int x) : value{x}
    {
        cout << "Base (int) overloaded constructor called" << endl;
    }
    ~Base()
    {
        cout << "Base Destructor called" << endl;
    }
};

class Derived : public Base
{
private:
    int testing_value;
    int doubled_value;

public:
    Derived() : Derived{0, 0}
    {
        cout << "NO arg constructor called" << endl;
    };

    // 单参数构造函数仅委托给双参数构造函数,传递目标参数
    Derived(int testing_val) : Derived{testing_val, testing_val * 2}
    {
        cout << "One arg constructor called" << endl;
    }
    
    // 双参数构造函数负责初始化基类和自身成员
    Derived(int testing_val, int doubled_val) : Base{testing_val}, testing_value{testing_val}, doubled_value{doubled_val}
    {
        cout << "Overloaded constructor called" << endl;
    }

    ~Derived()
    {
        cout << "Derived destructor called" << endl;
    }
};

int main()
{
    Derived d{1000};
    return 0;
}

代码说明

  1. 双参数构造函数Derived(int testing_val, int doubled_val)的初始化列表中,先调用Base{testing_val}完成基类成员value的初始化,再初始化自身的testing_value和doubled_value。
  2. 单参数构造函数Derived(int testing_val)仅通过委托Derived{testing_val, testing_val * 2},将testing_val传递给双参数构造函数,同时按需求生成doubled_value的值(也可直接传入固定值2000)。
  3. 无参构造函数保持原有委托逻辑,不影响功能。

运行结果

执行Derived d{1000}后,输出如下:

Base (int) overloaded constructor called
Overloaded constructor called
One arg constructor called
Derived destructor called
Base Destructor called

完全满足需求:Base的value被初始化为1000,Derived的testing_value为1000、doubled_value为2000。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:25:51