为何无法通过构造函数更新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
相关产品推荐
相关产品推荐

