Как использовать объекты-наследники в функциях родительского класса в C++? Суть такова. У меня есть два класса: MovableObject и GravitySource, наследуемый от предыдущего (т.к. источники гравитации тоже могут двигаться). В классе MovableObject есть функция integrate, вычисляющая параметры движения на основе списка переданных в нее источников гравитации. Но т.к. GravitySource наследуется от этого класса, я не могу передать его в эту функцию. А создавать дубликаты родительских функций не хотелось бы (он ведь все таки тоже должен двигаться и тоже содержать пресловутую integrate). Какой выход из этой ситуации можно найти?
Для решения данной проблемы можно воспользоваться механизмом полиморфизма в C++. В классе MovableObject можно использовать указатель на базовый класс GravitySource в качестве аргумента функции integrate. Таким образом, в функцию integrate можно передавать объекты как класса GravitySource, так и его наследников.
Пример:
#include <iostream> #include <vector> class GravitySource { public: virtual void applyGravity() { // применяем гравитацию } }; class MovableObject { public: void integrate(GravitySource* gravitySource) { gravitySource->applyGravity(); // реализация вычислений движения } }; class Planet : public GravitySource { public: void applyGravity() override { // применяем гравитацию планеты } }; class BlackHole : public GravitySource { public: void applyGravity() override { // применяем гравитацию черной дыры } }; int main() { MovableObject object; Planet planet; BlackHole blackHole; object.integrate(&planet); object.integrate(&blackHole); return 0; }
В данном примере мы создаем два класса-наследника от GravitySource (Planet и BlackHole) и передаем их в функцию integrate класса MovableObject. Таким образом, мы можем использовать объекты-наследники в функциях родительского класса, не создавая дубликаты функций.
Для решения данной проблемы можно воспользоваться механизмом полиморфизма в C++. В классе MovableObject можно использовать указатель на базовый класс GravitySource в качестве аргумента функции integrate. Таким образом, в функцию integrate можно передавать объекты как класса GravitySource, так и его наследников.
Пример:
#include <iostream>#include <vector>
class GravitySource {
public:
virtual void applyGravity() {
// применяем гравитацию
}
};
class MovableObject {
public:
void integrate(GravitySource* gravitySource) {
gravitySource->applyGravity();
// реализация вычислений движения
}
};
class Planet : public GravitySource {
public:
void applyGravity() override {
// применяем гравитацию планеты
}
};
class BlackHole : public GravitySource {
public:
void applyGravity() override {
// применяем гравитацию черной дыры
}
};
int main() {
MovableObject object;
Planet planet;
BlackHole blackHole;
object.integrate(&planet);
object.integrate(&blackHole);
return 0;
}
В данном примере мы создаем два класса-наследника от GravitySource (Planet и BlackHole) и передаем их в функцию integrate класса MovableObject. Таким образом, мы можем использовать объекты-наследники в функциях родительского класса, не создавая дубликаты функций.