Возвращение дочернего класса в качестве абстрактного родительского класса - PullRequest
0 голосов
/ 22 ноября 2018

Я пишу консольную программу на C ++.Допустим, у меня есть абстрактный класс Animal, от которого наследуются экземпляры классов Dog и Cat.

Затем я хочу создать vector<Animal*>, чтобы я мог просмотреть весь списокживотных я создал и использую их виртуальную функцию GetName(), которая перегружена в дочерних классах.Пока здесь все в порядке.

Теперь у меня есть эта функция в main(), которая называется createAnimal().Я хочу сделать это таким образом, чтобы он мог возвращать указатель (или ссылку) на родительский класс, независимо от того, был ли создан Dog или Cat.Поэтому я хотел сделать это как Animal* createAnimal(), но затем появляется ошибка, говорящая мне «Животное»: невозможно создать экземпляр абстрактного класса .Как я могу вернуть (каким-либо образом указатель, ссылку) дочерний класс в качестве абстрактного родительского класса?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018
Animal *cat = new Cat();
Animal *dog = new Dog();

Если классы Cat и Dog являются потомками класса Animal

class Cat : public Animal{
}

класс Animal должен иметь getName в качестве чистой виртуальной функции

 Class Animal {
 ...
 virtual std::string   getName() = 0;
 ...
 }

затемвы можете управлять своими классами Cat и Dog как классом Animal и вызывать функцию-член getName, не забывайте переопределять эту функцию в Cat.cpp и Dog.cpp

Я советую вам прочитать некоторую документацию по интерфейсуклассы (классы, которые получили только чисто виртуальные функции)

0 голосов
/ 22 ноября 2018

То, что вы пытаетесь достичь, называется фабрикой объектов , но полученное сообщение об ошибке означает, что вы либо неправильно реализовали функцию (что-то вроде new Animal, хотя вам никогда не следует создавать экземплярсам абстрактный абстрактный класс, только его дочерние элементы), или вы используете результат неправильно (например, Animal animal = createAnimal()?)

Итак, ваш код такой?

Animal *CreateAnimal(int type) {
    if(type == 1) return new Cat;
}

std::vector<Animal *> animalVector;

animalVector.push_back(CreateAnimal(1));

Тогдаэто должно работать.

...