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