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