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

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;
}

修复说明

  1. 虚基类初始化:所有虚继承Vehicle的中间类不再初始化Vehicle,由最派生类直接调用Vehicle构造函数完成初始化。
  2. 拼写修正:修复GasVehicle构造函数的拼写错误。
  3. 参数顺序调整:修正Bus构造函数的参数顺序,匹配HeavyVehicle的参数列表,避免赋值错位。
  4. 成员初始化:给Vehicle的未使用成员设置默认值,消除未定义行为风险。
  5. 继承权限修正:SportsCar显式使用public继承HighPerformance,确保外部可调用其构造函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:36:59