Позволяет говорят, что у меня есть CAT абстрактного класса, который имеет несколько Рискованных предприятий подклассов бетона, Housecat, и т.д.
Я хочу, чтобы мой массив смог сохранить указатели на тип кошки, не зная, какой вид это действительно.
Когда я пытаюсь динамично выделить массив CAT, это, кажется, не работает.
Cat* catArray = new Cat[200];
Путем создания массива указателей на 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) для вас
Вам потребуется создать массив указателей на Cat
:
Cat** catArray = new Cat*[200];
Даже если базовый класс Cat
был конкретным, вы все равно столкнетесь с нарезкой объекта , если создадите массив Cat
.
Обратите внимание, что вам, вероятно, следует использовать std :: vector
вместо массива и, вероятно, следует использовать интеллектуальные указатели, чтобы убедиться, что ваш код безопасен в отношении исключений.
Вы не можете собрать кошек в клетках фиксированного размера, потому что у компилятора нет способа узнать, насколько большими будут кошки, и (неудачная метафора) как для их инициализации. Вам нужно будет сделать что-то вроде инициализации массива нулевыми кошачьими указателями или что-то в этом роде, а затем скопировать их.
Вы не можете напрямую создать экземпляр абстрактного класса, вместо этого необходимо создать экземпляр полностью реализованного подкласса.
Итак, это допустимо:
Housecat* theCats = new Housecat[200];
и тогда вы можете получить доступ к каждому коту через интерфейс Cat
bool catsMeow = ((Cat*)(&theCats[0]))->CanMeow();
Но компилятор не знает, как создать экземпляр абстрактного класса; Фактически, тот факт, что он абстрактный, означает, что он не может быть создан напрямую.
Зачем это нужно? Потому что у Cat будет абстрактный метод
bool CanMeow() = 0;
, который должны реализовывать все унаследованные кошки. Затем вы можете спросить, может ли он мяукать, с вероятностью, что экземпляр Lion вернет false.