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

为何无法通过构造函数更新C++派生类的默认值?

问题分析

你创建的Employee类无参构造函数仅初始化了自身的st_career成员,没有修改基类BasePerson的st_firstName、st_lastName和d_wagePerHour。当你调用Employee emp1;时,会先自动调用基类的无参构造函数,把这三个成员设置为基类的默认值,所以最终输出的是基类的默认内容。

解决方案

要让无参创建的Employee对象使用自定义的默认值,有两种常用方式:

方式1:在派生类无参构造中直接修改基类protected成员

利用protected成员可被派生类访问的特性,在Employee的无参构造里直接覆盖基类成员的默认值:

class Employee : public BasePerson
{
private :
    string st_career;

public :
    Employee()
    {
       st_career = "Default Career";
       // 覆盖基类的默认值
       st_firstName = "Bob";
       st_lastName = "Vila";
       d_wagePerHour = 50.0; // 可自定义时薪
    }

    // 保留原带参构造
    Employee(string param_firstName, string param_lastName, double param_wage, string param_career) : BasePerson(param_firstName, param_lastName, param_wage)
    {
        st_firstName = "Bob";
        st_lastName = "Vila";
    }
};

方式2:委托基类带参构造初始化(更推荐)

直接在Employee无参构造的初始化列表中调用基类的带参构造,一次性设置基类成员的自定义默认值,这种方式更符合C++构造初始化的最佳实践:

class Employee : public BasePerson
{
private :
    string st_career;

public :
    // 委托基类带参构造设置自定义默认值
    Employee() : BasePerson("Bob", "Vila", 50.0)
    {
       st_career = "Default Career";
    }

    // 保留原带参构造
    Employee(string param_firstName, string param_lastName, double param_wage, string param_career) : BasePerson(param_firstName, param_lastName, param_wage)
    {
        st_firstName = "Bob";
        st_lastName = "Vila";
    }
};
修改后的完整代码示例
#include <iostream>
#include <string>
using namespace std;

class BasePerson
{
protected :
    string st_firstName;
    string st_lastName;

public :
    double d_wagePerHour;

    BasePerson()
    {
        st_firstName = "Default First Name";
        st_lastName = "Default Last Name";
        d_wagePerHour = 40.12;
    }

    BasePerson(string param_firstName, string param_lastName, double param_wage)
    {
        st_firstName = param_firstName;
        st_lastName = param_lastName;
        d_wagePerHour = param_wage;
    }

    void fn_printAllInfo()
    {
        cout << "First Name: " << st_firstName << "\n" << "Last Name: " << st_lastName << "\n" << "Wage Per Hour: " << d_wagePerHour << endl;
    }
};

class Employee : public BasePerson
{
private :
    string st_career;

public :
    // 使用方式2的构造初始化
    Employee() : BasePerson("Bob", "Vila", 50.0)
    {
       st_career = "Default Career";
    }

    Employee(string param_firstName, string param_lastName, double param_wage, string param_career) : BasePerson(param_firstName, param_lastName, param_wage)
    {
        st_firstName = "Bob";
        st_lastName = "Vila";
    }
};

int main()
{
    BasePerson person1;
    person1.fn_printAllInfo();

    Employee emp1;
    emp1.fn_printAllInfo();

    return 0;
}

运行这段代码后,emp1.fn_printAllInfo()会输出你期望的Bob Vila和自定义时薪,而不是基类的默认值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:27:06