如何使用委托构造函数从派生类调用基类构造函数?
派生类委托构造函数调用基类构造函数的问题解决
问题描述
编写派生类构造函数时,尝试同时委托同类型构造函数并调用基类构造函数,触发编译错误: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; }
代码说明
- 双参数构造函数
Derived(int testing_val, int doubled_val)的初始化列表中,先调用Base{testing_val}完成基类成员value的初始化,再初始化自身的testing_value和doubled_value。 - 单参数构造函数
Derived(int testing_val)仅通过委托Derived{testing_val, testing_val * 2},将testing_val传递给双参数构造函数,同时按需求生成doubled_value的值(也可直接传入固定值2000)。 - 无参构造函数保持原有委托逻辑,不影响功能。
运行结果
执行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
相关产品推荐
相关产品推荐

