Во-первых, функция-член Parent
должна быть virtual
.
class Parent
{
public:
Parent(){}
virtual void print() {std::cout << "I'm the parent!" << std::endl;};
};
Тогда дочерние элементы должны переопределить ее.В C ++ 11 и более поздних версиях рекомендуется использовать override
class ChildOne : public Parent
{
public:
ChildOne(){}
void print() override {std::cout << "I'm childOne!" << std::endl;};
};
Второе, на что следует обратить внимание, это то, что ваш код в main()
Parent arr[] = {ChildOne(), ChildTwo()};
инициализирует два Parent
объекта путем нарезки, т. Е. arr[0]
и arr[1]
оба имеют тип Parent
, а не ChildOne
или ChildTwo
соответственно.
Для адресации это необходимочто arr
будет массивом указателей и соответственно инициализирован.
Parent *arr[] = {new ChildOne(), new ChildTwo()};
, за которым может следовать
for(int i = 0; i < 2; i++)
{
arr[i]->print();
}
for(int i = 0; i < 2; i++) // to avoid a memory leak
{
delete arr[i];
}
// don't use elements of `arr` here
Лучший способ (C ++ 11 и более поздние версии)писать main()
означает использовать std::unique_ptr
из стандартного заголовка <memory>
)
std::unique_ptr<Parent> arr[] = {new ChildOne(), new ChildTwo()};
, что позволяет покончить с циклом для освобождения элементов arr
.В C ++ 14 и более поздних версиях объекты в arr
могут быть созданы с использованием std::make_unique()
.