CCCPaste

ed4273e209f3b

#include 
#include 
using namespace std;

// Interfața Vehicle
class Vehicle {
public:
    virtual void displayInfo() const = 0; // metodă pur virtuală
    virtual void setPrice(int price) = 0; // metodă pur virtuală
    virtual int getPrice() const = 0; // metodă pur virtuală
    virtual ~Vehicle() {}
};

// Clasa abstractă Electric
class Electric {
protected:
    char* brand;
    int year;
    int price;

public:
    Electric(const char* brand = "", int year = 0, int price = 0)
        : year(year), price(price) {
        this->brand = new char[strlen(brand) + 1];
        strcpy(this->brand, brand);
    }

    Electric(const Electric& other) {
        brand = new char[strlen(other.brand) + 1];
        strcpy(brand, other.brand);
        year = other.year;
        price = other.price;
    }

    Electric& operator=(const Electric& other) {
        if (this != &other) {
            delete[] brand;
            brand = new char[strlen(other.brand) + 1];
            strcpy(brand, other.brand);
            year = other.year;
            price = other.price;
        }
        return *this;
    }

    virtual ~Electric() {
        delete[] brand;
    }

    // Getters și setters
    const char* getBrand() const { return brand; }
    void setBrand(const char* newBrand) {
        delete[] brand;
        brand = new char[strlen(newBrand) + 1];
        strcpy(brand, newBrand);
    }

    int getYear() const { return year; }
    void setYear(int newYear) { year = newYear; }

    int getPrice() const { return price; }
    void setPrice(int newPrice) { price = newPrice; }

    virtual void displayInfo() const {
        cout << "Brand: " << brand << ", Year: " << year << ", Price: " << price << endl;
    }
};

// Clasa derivată Car
class Car : public Vehicle {
protected:
    int price;
    int year;
    char* brand;

public:
    Car(const char* brand = "", int year = 0, int price = 0)
        : year(year), price(price) {
        this->brand = new char[strlen(brand) + 1];
        strcpy(this->brand, brand);
    }

    Car(const Car& other) {
        brand = new char[strlen(other.brand) + 1];
        strcpy(brand, other.brand);
        year = other.year;
        price = other.price;
    }

    Car& operator=(const Car& other) {
        if (this != &other) {
            delete[] brand;
            brand = new char[strlen(other.brand) + 1];
            strcpy(brand, other.brand);
            year = other.year;
            price = other.price;
        }
        return *this;
    }

    virtual ~Car() {
        delete[] brand;
    }

    void setPrice(int price) override { this->price = price; }
    int getPrice() const override { return price; }

    void displayInfo() const override {
        cout << "Car - Brand: " << brand << ", Year: " << year << ", Price: " << price << endl;
    }

    // Operator <
    bool operator<(const Car& other) const {
        return this->price < other.price;
    }
};

// Clasa derivată ElectricCar
class ElectricCar : public Car, public Electric {
private:
    double batteryCapacity;

public:
    ElectricCar(const char* brand = "", int year = 0, int price = 0, double batteryCapacity = 0.0)
        : Car(brand, year, price), Electric(brand, year, price), batteryCapacity(batteryCapacity) {}

    void setBatteryCapacity(double capacity) { batteryCapacity = capacity; }
    double getBatteryCapacity() const { return batteryCapacity; }

    void displayInfo() const override {
        cout << "ElectricCar - Brand: " << brand
             << ", Year: " << year
             << ", Price: " << price
             << ", Battery Capacity: " << batteryCapacity << " kWh" << endl;
    }
};

int main() {
    // Nu putem crea un obiect de tip Vehicle deoarece este o clasă abstractă.
    // Vehicle v;

    // Testarea clasei Car
    Car car1("Toyota", 2020, 20000);
    Car car2("Honda", 2018, 15000);
    car1.displayInfo();
    car2.displayInfo();
    cout << (car1 < car2 ? "car1 is cheaper" : "car2 is cheaper") << endl;

    // Testarea clasei ElectricCar
    ElectricCar ecar1("Tesla", 2022, 50000, 75.0);
    ecar1.displayInfo();
    ecar1.setPrice(48000);
    ecar1.setBatteryCapacity(80.0);
    ecar1.displayInfo();

    // Obiecte de tip Vehicle* alocând ElectricCar și Car
    Vehicle* v1 = new ElectricCar("Nissan Leaf", 2021, 30000, 40.0);
    Vehicle* v2 = new Car("Ford", 2019, 18000);

    v1->displayInfo();
    v2->displayInfo();

    delete v1;
    delete v2;

    return 0;
}