Я пытаюсь понять виртуальные классы в C ++. В Википедии я нашел этот пример:
#include <iostream>
class Machine {
public:
void run() { }
class Parts {
public:
virtual int get_wheels() = 0;
virtual std::string get_fuel_type() = 0;
};
};
// The inner class "Parts" of the class "Machine" may return the number of wheels the machine has.
class Car: Machine {
public:
void run() {
std::cout << "The car is running." << std::endl;
}
class Parts: Machine::Parts {
public:
int get_wheels() override {
std::cout << "A car has 4 wheels." << std::endl;
return 4;
}
std::string get_fuel_type() override {
std::cout << "A car uses gasoline for fuel." << std::endl;
return "gasoline";
}
};
};
Я могу получить количество колес автомобиля с помощью:
Car::Parts c_p;
c_p.get_wheels();
Есть ли другие (простые ) путь? Есть ли способ создания только Car car
?
Обновление:
Я понимаю проблемы, но считаю его полезным в качестве вложенного интерфейса (с минимальными изменениями):
#include <iostream>
#include <memory>
class Machine {
public:
virtual void run() = 0;
class Parts {
public:
virtual int get_wheels() = 0;
virtual std::string get_fuel_type() = 0;
};
};
class Car: public Machine {
public:
void run() {
std::cout << "The car is running." << std::endl;
}
class Parts: public Machine::Parts {
public:
int get_wheels() override {
std::cout << "A car has 4 wheels." << std::endl;
return 4;
}
std::string get_fuel_type() override {
std::cout << "A car uses gasoline for fuel." << std::endl;
return "gasoline";
}
};
};
int main () {
std::shared_ptr<Machine> X = std::make_shared<Car>();
(*X).run();
std::shared_ptr<Machine::Parts> Y = std::make_shared<Car::Parts>();
(*Y).get_wheels();
return 0;
}
Я не нахожу другого кода с этой функциональностью. Единственное, чего мне не хватает - это возможности доступа к get_wheels
напрямую с X
. Например, давайте рассмотрим, что у меня есть Machine
в моей программе. Тип машины у меня будет указываться динамически. Я хочу знать количество колес этой машины, но метод get_wheels
должен быть внутри вложенного класса Parts
. Чем ближе я решаю эту проблему, тем выше код, который дает мне Machine
и Machine::Parts
в качестве интерфейсов.