Как запустить функции абстрактного класса и унаследованные функции?

Я только что узнал об абстрактном классе, но я мало что понимаю. Можно ли одновременно запускать функции абстрактного класса и унаследованные функции? ..

Например,

class Animals
{
public:
virtual void Display() = 0;
};

class Dog : public Animals
{
void Display()
{
cout << "This is Dog!" << endl;
};

class Cat : public Animals
{
void Display()
{
cout << "This is Cat!" << endl;
}
};

и у меня есть другой класс под названием Zoo, который будет запускать абстрактную функцию в классе Animals

class Zoo : public Animals
{
Animals* animal;
animal->Display();
}

и вывод, который я хочу,

This is Dog!
This is Cat!

Когда я запускаю это, у него есть ошибки .. Есть ли другие способы получить этот вывод? Спасибо 🙂

-2

Решение

Во-первых, есть синтаксическая ошибка:

 class Animals
{
public:
virtual void Display() = 0;
};

class Dog : public Animals
{
void Display()
{
cout << "This is Dog!" << endl;
}
};

class Cat : public Animals
{
void Display()
{
cout << "This is Cat!" << endl;
}
};

Затем, если вы хотите создать экземпляры Dog и Cat, вы вызываете новые операторы для этих классов:

class Zoo : public Animals
{
void Display()
{
Animals* animal1;
animal1 = new Cat();
animal1->Display();
delete animal1;

Animals* animal2;
animal2 = new Dog();
animal2->Display();
delete animal2;
}

}

Это должно получить желаемый результат.

0

Другие решения

animal->Display(); приводит к неопределенному поведению, потому что animal не инициализируется, поэтому сначала инициализируется как

    Cat my_cat;
Animals* animal = &my_cat;
animal->Display();

ИЛИ ЖЕ

 Animals* animal = new Cat();
animal->Display();
....
delete  animal;

Вот ваш код, объяснение есть в комментариях.

class Animals {
public:
virtual void Display() = 0;/*its a PVF , in every derived class it should be re-defined */
};

class Dog : public Animals {
void Display() {
cout << "This is Dog!" << endl;
};
};
class Cat : public Animals {
void Display() {
cout << "This is Cat!" << endl;
}
};

class Zoo : public Animals {
public :
void Display() {
#if 1
Dog my_dog;
Animals *animal = &my_dog; /** Display() of Animal class will be invoked  bcz Display() is declared as  virtual */
animal->Display();
#endif
#if 0
Animals* animal = new Cat(); /** Display() of Cat class  eill be invoked */
animal->Display();
delete animal;
#endif
}
};
int main() {
Zoo my_zoo;
my_zoo.Display();
return 0;
}

Я надеюсь, что это поможет вам.

0

Есть ли способ вызвать только базовый класс и запустить унаследованные классы тоже?

Я думаю, что вы хотите это:

#include <iostream>
#include <memory>

class Animals
{
public:
virtual void Display() = 0;
virtual ~Animals() = default;
};

class Dog : public Animals
{
void Display() override
{
std::cout << "This is Dog!" << std::endl;
}
};

class Cat : public Animals
{
void Display() override
{
std::cout << "This is Cat!" << std::endl;
}
};

class Goat : public Animals
{
void Display() override
{
std::cout << "This is Goat!" << std::endl;
}
};

int main()
{
Animals* animal = new Dog;
animal->Display();
delete animal; // delete at some point to avoid memory leak as Dog is allocated on the heap

Cat cat;
animal = &cat;
animal->Display(); // no delete needed, as Cat is allocated on the stack and will cleared when goes out of scope

std::unique_ptr<Animals> animal2 = std::make_unique<Goat>();
animal2->Display(); // no delete needed, Goat is allocated on the heap but will be cleared when goes out of scope

return 0;
}

https://ideone.com/yoVt4G

Бросил std::unique_ptr в смеси для разнообразия

0
По вопросам рекламы [email protected]