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

допустим, у меня есть абстрактный класс 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.