Как работает полиморфизм при работе с массивами дочерних объектов?

153
26 февраля 2018, 01:50

К примеру:

class interface
{
public: 
  virtual void do_something()
  {
     something..
  }
}
class base : public interface
{
public: 
  virtual void do_something()
  {
     somethingElse..
  }
}
class child : public interface, public base
{
public: 
  override void do_something()
  {
     somethingDifferent..
  }
}
class child2 : public interface, public base
{
public: 
  override void do_something()
  {
     somethingDifferent..
  }
}

Мне нужно, чтобы объекты класов child и child2, к примеру находились в одном массиве. Если я создам массив элементов base, я смогу обращаться к ним через интерфейс? Или обязательно создавать массив объектов interface? Т. е. если я укажу тип данных base для массива, компилятор все равно выделит память под полный тип данных объекта включая interface? Или нет?

Answer 1

Если вы создадите массив объектов base, то, как вы понимаете, каждому объекту будет выделена память только под base, и вы получите при присваивании срезку.

Используйте массив указателей на base - и все получится :)

Еще - непонятно, зачем вы делаете child производным и от base, и от interface, при том, что interface является производным от base. Не то чтобы это было запрещено... но это очень специфичное решение, которое вряд ли вам необходимо, скорее, вы немного недоразобрались в вопросе.

Да, и override пишется с другой стороны объявления :)

READ ALSO
Получение введённой в консоль строки

Получение введённой в консоль строки

Использую для получения строки с консоли

268
Заглавные и строчные буквы

Заглавные и строчные буквы

Здраствуйте, А есть ли функция, с помощью которой я мог бы преобразовать заглавную букву в строчную

184
Исправка кода бинарного дерева

Исправка кода бинарного дерева

Помогите исправить код

161
Как работает live-стрим в YouTube?

Как работает live-стрим в YouTube?

Прямая трансляция пишется на диск и при этом раздаётся в браузер в реальном времени всем, кто её запросил

168