C++虚继承场景下基类数据成员未初始化问题求助
问题分析与修复
核心问题:虚继承下的基类初始化错误
由于GasVehicle和ElectricVehicle都是虚继承Vehicle,在多重继承的HeavyVehicle(以及派生的Bus)中,虚基类Vehicle的初始化必须由最派生类直接完成,而非中间子类。原代码中GasVehicle和ElectricVehicle的构造函数尝试初始化Vehicle,但编译器会忽略这些调用,转而调用Vehicle的空构造函数,导致Type、Model等成员未被赋值。
其他错误
GasVehicle类存在拼写错误:GasVehilce(){} → GasVehicle(){},会导致编译失败。Bus构造函数调用HeavyVehicle时参数顺序不匹配(lenght和FuelTankSize颠倒),引发成员赋值错误。Vehicle类的year和MilesDriven成员从未初始化,可能触发未定义行为。SportsCar默认使用私有继承HighPerformance,导致外部无法调用其构造函数。
修复后的代码
#include<iostream> #include<string> using namespace std; class Vehicle{ private: string Type, Make, Model, Color; int year = 0; float MilesDriven = 0.0f; public: Vehicle(){} Vehicle(string Type, string Make, string Model, string Color) { this->Type = Type; this->Make = Make; this->Model = Model; this->Color = Color; } string getType(){ return Type; } string getModel(){ return Model; } string getMake(){ return Make; } string getColor(){ return Color; } int getYear(){ return year; } }; class GasVehicle : virtual public Vehicle { private: double FuelTankSize; public: GasVehicle(){} GasVehicle(double FuelTankSize) { this->FuelTankSize = FuelTankSize; } double getFuelTankSize(){ return FuelTankSize; } }; class ElectricVehicle : virtual public Vehicle{ private: string EnergyStorage; public: ElectricVehicle(string EnergyStorage) { this->EnergyStorage = EnergyStorage; } string getEnergy(){ return EnergyStorage; } }; class HighPerformance : public GasVehicle { private: int horsesPower; int TopSpeed; public: HighPerformance(int horsesPower, int Topspeed, double FuelTankSize, string Type, string Make, string Model, string Color) : GasVehicle(FuelTankSize), Vehicle(Type, Make, Model, Color) { this->horsesPower = horsesPower; this->TopSpeed = Topspeed; } }; class SportsCar : public HighPerformance { private: string GearBox; string DriveSystem; string RunWheel; public: SportsCar(string GearBox, string DriveSystem, string RunWheel, int horsesPower, int Topspeed, double FuelTankSize, string Type, string Make, string Model, string Color) : HighPerformance(horsesPower, Topspeed, FuelTankSize, Type, Make, Model, Color) { this->GearBox = GearBox; this->DriveSystem = DriveSystem; this->RunWheel = RunWheel; } }; class HeavyVehicle : public GasVehicle, public ElectricVehicle { private: double MaxiWeight; int NumberOfWheels; int lenght; public: HeavyVehicle(double MaxiWeight, int NumberOfWheels, int lenght, double FuelTankSize, string EnergyStorage, string Type, string Make, string Model, string Color) : Vehicle(Type, Make, Model, Color), GasVehicle(FuelTankSize), ElectricVehicle(EnergyStorage) { this->MaxiWeight = MaxiWeight; this->NumberOfWheels = NumberOfWheels; this->lenght = lenght; } double getMaxiWeight(){ return MaxiWeight; } int getNumberOfWheels(){ return NumberOfWheels; } int getLenght(){ return lenght; } }; class Bus : public HeavyVehicle { private: int NumberOfseats; public: Bus(int NumberOfSeats, double MaxiWeight, int NumberOfWheels, int lenght, double FuelTankSize, string EnergyStorage, string Type, string Make, string Model, string Color) : HeavyVehicle(MaxiWeight, NumberOfWheels, lenght, FuelTankSize, EnergyStorage, Type, Make, Model, Color) { this->NumberOfseats = NumberOfSeats; } void SetNumberOfseats(int seats){ this->NumberOfseats += seats; } int getNumberOfseats(){ return NumberOfseats; } void Display(){ cout << "Number Of Seats: " << getNumberOfseats() << endl; cout << "MaxiWeight: " << getMaxiWeight() << endl; cout << "Number Of wheels: " << getNumberOfWheels() << endl; cout << "Length: " << getLenght() << endl; cout << "FuelTankSize: " << getFuelTankSize() << endl; cout << "Type: " << getType() << endl; cout << "Model: " << getModel() << endl; cout << "Make: " << getMake() << endl; cout << "Color: " << getColor() << endl; } }; int main(){ Bus Obj(5, 1200.0, 8, 102, 304.0, "Storage", "Metalic", "MXS", "2001-Suzuki", "White"); Obj.Display(); return 0; }
修复说明
- 虚基类初始化:所有虚继承
Vehicle的中间类不再初始化Vehicle,由最派生类直接调用Vehicle构造函数完成初始化。 - 拼写修正:修复
GasVehicle构造函数的拼写错误。 - 参数顺序调整:修正
Bus构造函数的参数顺序,匹配HeavyVehicle的参数列表,避免赋值错位。 - 成员初始化:给
Vehicle的未使用成员设置默认值,消除未定义行为风险。 - 继承权限修正:
SportsCar显式使用public继承HighPerformance,确保外部可调用其构造函数。
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

