Как создать динамический массив Абстрактного класса?

Позволяет говорят, что у меня есть CAT абстрактного класса, который имеет несколько Рискованных предприятий подклассов бетона, Housecat, и т.д.

Я хочу, чтобы мой массив смог сохранить указатели на тип кошки, не зная, какой вид это действительно.

Когда я пытаюсь динамично выделить массив CAT, это, кажется, не работает.

Cat* catArray = new Cat[200];
14
задан Willi Mentzel 19 October 2015 в 21:06
поделиться

4 ответа

Путем создания массива указателей на Cat, как в

 Cat** catArray = new Cat*[200];

. Теперь вы можете разместить свои экземпляры WildCat, HouseCat и т. Д. В различных местах массива, например

 catArray[0] = new WildCat();
 catArray[1] = new HouseCat();
 catArray[0]->catchMice(); 
 catArray[1]->catchMice();

Несколько предостережений, когда закончите
a) Не забудьте удалить экземпляры, выделенные в catArray, как в delete catArray [0] и т. Д.
б) Дон ' Не забудьте удалить сам catArray, используя

 delete [] catArray;

. Вам также следует подумать об использовании вектора для автоматизации b) для вас

20
ответ дан 1 December 2019 в 08:52
поделиться

Вам потребуется создать массив указателей на Cat :

Cat** catArray = new Cat*[200];

Даже если базовый класс Cat был конкретным, вы все равно столкнетесь с нарезкой объекта , если создадите массив Cat .

Обратите внимание, что вам, вероятно, следует использовать std :: vector вместо массива и, вероятно, следует использовать интеллектуальные указатели, чтобы убедиться, что ваш код безопасен в отношении исключений.

7
ответ дан 1 December 2019 в 08:52
поделиться

Вы не можете собрать кошек в клетках фиксированного размера, потому что у компилятора нет способа узнать, насколько большими будут кошки, и (неудачная метафора) как для их инициализации. Вам нужно будет сделать что-то вроде инициализации массива нулевыми кошачьими указателями или что-то в этом роде, а затем скопировать их.

4
ответ дан 1 December 2019 в 08:52
поделиться

Вы не можете напрямую создать экземпляр абстрактного класса, вместо этого необходимо создать экземпляр полностью реализованного подкласса.

Итак, это допустимо:

Housecat* theCats = new Housecat[200];

и тогда вы можете получить доступ к каждому коту через интерфейс Cat

bool catsMeow = ((Cat*)(&theCats[0]))->CanMeow();

Но компилятор не знает, как создать экземпляр абстрактного класса; Фактически, тот факт, что он абстрактный, означает, что он не может быть создан напрямую.

Зачем это нужно? Потому что у Cat будет абстрактный метод

bool CanMeow() = 0;

, который должны реализовывать все унаследованные кошки. Затем вы можете спросить, может ли он мяукать, с вероятностью, что экземпляр Lion вернет false.

0
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: