Что вам нужно, так это полиморфизм во время выполнения, который означает, что объект должен принимать «много форм» (т.е. a или b) и действовать соответствующим образом во время работы программы.В C ++ вы делаете это, делая функцию virtual
в базовом классе a
:
virtual void print() {cout << "hello"};
Затем вам нужно хранить элементы по указателю или по ссылке, и - как в общем случае производнуюклассы могут вводить новые члены данных и им нужно больше памяти - это нормально для создания объектов в куче с помощью new
:
a* blah[10];
blah[5] = new b();
Затем вы можете вызвать:
blah[5]->print();
И этовызовет b
реализацию print()
.
Вы должны позже delete blah[5]
(и любые другие, на которые вы указали в памяти, возвращается new
).
На практике,Хорошая идея - использовать контейнер, который может удалять содержащиеся в нем объекты, когда он сам разрушается, либо из-за выхода из области видимости, либо из-за удаления.std::vector<>
является одним из таких контейнеров.Вы также можете использовать смарт-указатели для автоматизации удаления объектов a
и b
.Это помогает сделать код корректным, если перед выполнением ваших операторов delete
создаются исключения, и вы хотите, чтобы ваша программа продолжала работать без утечки памяти.Библиотека boost - самое простое / лучшее место для реализации интеллектуальных указателей.Вместе:
#include <vector>
#include <boost/shared_ptr.hpp>
std::vector<boost::shared_pointer<a> > blah(10);
blah[5] = new b();
(более нормально использовать векторы с push_back()
, поскольку он автоматически увеличивает вектор, чтобы соответствовать всем добавленным элементам, с новым общим количеством, доступным по вызову vector::size()
.)