如何根据派生类构造器参数确定抽象基类构造器的初始化值
问题:派生类构造器中根据参数初始化基类私有成员
type 用户的抽象基类vehicle代码如下:
#pragma once using namespace std; #include <string> #include <iostream> class vehicle { public: vehicle(string reg, string make, string model, int age, string type); virtual ~vehicle() = default; virtual double costPerDay() = 0; protected: int age; int perDayCostCap(int costPD); double penceToPounds(int pence); private: const string type; string const reg, make, model; };
用户需要实现派生类bike的构造器,接收numberOfWheels参数,根据该参数将基类的type初始化为"bicycle"或"tricycle",但由于基类必须在派生类函数体执行前初始化,用户尝试的写法不可行:
bike::bike(int engineCC, int numOfWheels, string reg, string make, string model, int age) :engineCC(engineCC), numOfWheels(numOfWheels) { string tricOrBic = (numOfWheels == 2) ? "bicicle" : "tricicle"; vehicle:reg=reg, make=make, model=model, age=age, type=tricOrBic; };
解决方案
方法1:直接在初始化列表中使用三元运算符
可以直接在派生类的初始化列表里,通过三元表达式生成type的取值,再传递给基类构造器。注意修正拼写错误(bicicle应为bicycle,tricicle应为tricycle):
// 先补充bike类的定义 class bike : public vehicle { private: int engineCC; int numOfWheels; public: bike(int engineCC, int numOfWheels, string reg, string make, string model, int age); }; // 构造器实现 bike::bike(int engineCC, int numOfWheels, string reg, string make, string model, int age) : vehicle(reg, make, model, age, (numOfWheels == 2) ? "bicycle" : "tricycle"), engineCC(engineCC), numOfWheels(numOfWheels) {}
这种方式简洁直接,适合逻辑简单的场景。
方法2:用静态辅助函数封装判断逻辑
如果后续需要扩展更复杂的轮数判断逻辑,用静态成员函数封装会更易维护:
class bike : public vehicle { private: int engineCC; int numOfWheels; // 静态辅助函数,根据轮数返回对应车辆类型 static string determineBikeType(int numOfWheels) { if (numOfWheels == 2) { return "bicycle"; } else if (numOfWheels == 3) { return "tricycle"; } else { // 可根据需求抛出异常或返回默认值 throw invalid_argument("Invalid number of wheels for bike"); } } public: bike(int engineCC, int numOfWheels, string reg, string make, string model, int age); }; // 构造器实现 bike::bike(int engineCC, int numOfWheels, string reg, string make, string model, int age) : vehicle(reg, make, model, age, determineBikeType(numOfWheels)), engineCC(engineCC), numOfWheels(numOfWheels) {}
关键注意点
- 基类的
type是const成员变量,必须在初始化阶段完成赋值,无法在派生类构造函数体内修改,因此必须通过初始化列表传递参数给基类构造器。 - 初始化列表中,基类的初始化建议放在派生类成员之前(编译器会自动调整基类初始化顺序优先,但显式书写更清晰)。
内容的提问来源于stack exchange,提问作者riverside96
相关产品推荐
相关产品推荐

