Я только что узнал об абстрактном классе, но я мало что понимаю. Можно ли одновременно запускать функции абстрактного класса и унаследованные функции? ..
Например,
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!
Когда я запускаю это, у него есть ошибки .. Есть ли другие способы получить этот вывод? Спасибо 🙂
Во-первых, есть синтаксическая ошибка:
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;
}
}
Это должно получить желаемый результат.
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;
}
Я надеюсь, что это поможет вам.
Есть ли способ вызвать только базовый класс и запустить унаследованные классы тоже?
Я думаю, что вы хотите это:
#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;
}
Бросил std::unique_ptr
в смеси для разнообразия