#include <iostream>
#include <string>
using namespace std;

// Base class: Vehicle
class Vehicle {
protected:
    string make;
    string model;
    int year;

public:
    Vehicle(string make, string model, int year): make(make), model(model), year(year) {
    }

    virtual void displayDetails() const {
        cout << "Vehicle Details:\n";
        cout << "Make: " << make << ", Model: " << model << ", Year: " << year << endl;
    }

    virtual ~Vehicle() {} // Virtual destructor for proper cleanup of derived class objects
};

// Subclass: Car
class Car : public Vehicle {
    int seatingCapacity;

public:
    Car(string make, string model, int year, int seatingCapacity)
        : Vehicle(make, model, year) {
        this->seatingCapacity = seatingCapacity;
    }

    void displayDetails() const override {
        Vehicle::displayDetails();
        cout << "Seating Capacity: " << seatingCapacity << endl;
    }
};

// Subclass: Truck
class Truck : public Vehicle {
    int payloadCapacity;

public:
    Truck(string make, string model, int year, int payloadCapacity)
        : Vehicle(make, model, year) {
        this->payloadCapacity = payloadCapacity;
    }

    void displayDetails() const override {
        Vehicle::displayDetails();
        cout << "Payload Capacity: " << payloadCapacity << " kg" << endl;
    }
};

// Subclass of Car: ElectricCar
class ElectricCar : public Car {
    int batteryCapacity; // Battery capacity in kWh

public:
    ElectricCar(string make, string model, int year, int seatingCapacity, int batteryCapacity)
        : Car(make, model, year, seatingCapacity) {
        this->batteryCapacity = batteryCapacity;
    }

    void displayDetails() const override {
        Car::displayDetails();
        cout << "Battery Capacity: " << batteryCapacity << " kWh" << endl;
    }
};

// Subclass of Truck: SemiTruck
class SemiTruck : public Truck {
    int axleCount;

public:
    SemiTruck(string make, string model, int year, int payloadCapacity, int axleCount)
        : Truck(make, model, year, payloadCapacity) {
        this->axleCount = axleCount;
    }

    void displayDetails() const override {
        Truck::displayDetails();
        cout << "Axle Count: " << axleCount << endl;
    }
};

// Main function
int main() {
    // Creating instances
    Car car("Toyota", "Corolla", 2020, 5);
    ElectricCar eCar("Tesla", "Model S", 2022, 5, 100);
    Truck truck("Ford", "F-150", 2019, 3000);
    SemiTruck semiTruck("Volvo", "FH16", 2021, 18000, 6);

    // Display details
    cout << "\nCar Details:\n";
    car.displayDetails();

    cout << "\nElectric Car Details:\n";
    eCar.displayDetails();

    cout << "\nTruck Details:\n";
    truck.displayDetails();

    cout << "\nSemi-Truck Details:\n";
    semiTruck.displayDetails();

    return 0;
}
