Как в C++ хранить объекты (либо указатели на них) в массиве (std::vector)? Есть ли возможность хранить объекты (или указатели на них) разных классов в массиве? И как?
Да, в C++ можно хранить объекты (или указатели на них) разных классов в массиве (std::vector). Для этого можно воспользоваться полиморфизмом и использовать указатели на базовый класс или интерфейс.
Пример:
#include <iostream> #include <vector> class Base { public: virtual void print() const { std::cout << "Base class" << std::endl; } }; class Derived1 : public Base { public: void print() const override { std::cout << "Derived class 1" << std::endl; } }; class Derived2 : public Base { public: void print() const override { std::cout << "Derived class 2" << std::endl; } }; int main() { std::vector<Base*> objects; objects.push_back(new Derived1()); objects.push_back(new Derived2()); for (const auto& obj : objects) { obj->print(); } // Освобождаем память for (const auto& obj : objects) { delete obj; } return 0; }
В этом примере мы создаем массив объектов Base, но добавляем в него указатели на объекты классов Derived1 и Derived2. Используя полиморфизм виртуальных функций, мы можем вызывать методы print() для каждого элемента массива и получать правильное поведение наследников.
Важно не забыть освободить выделенную память для каждого объекта после использования, чтобы избежать утечек памяти.
Да, в C++ можно хранить объекты (или указатели на них) разных классов в массиве (std::vector). Для этого можно воспользоваться полиморфизмом и использовать указатели на базовый класс или интерфейс.
Пример:
#include <iostream>#include <vector>
class Base {
public:
virtual void print() const {
std::cout << "Base class" << std::endl;
}
};
class Derived1 : public Base {
public:
void print() const override {
std::cout << "Derived class 1" << std::endl;
}
};
class Derived2 : public Base {
public:
void print() const override {
std::cout << "Derived class 2" << std::endl;
}
};
int main() {
std::vector<Base*> objects;
objects.push_back(new Derived1());
objects.push_back(new Derived2());
for (const auto& obj : objects) {
obj->print();
}
// Освобождаем память
for (const auto& obj : objects) {
delete obj;
}
return 0;
}
В этом примере мы создаем массив объектов Base, но добавляем в него указатели на объекты классов Derived1 и Derived2. Используя полиморфизм виртуальных функций, мы можем вызывать методы print() для каждого элемента массива и получать правильное поведение наследников.
Важно не забыть освободить выделенную память для каждого объекта после использования, чтобы избежать утечек памяти.