Абстрактный класс
Иногда для логического наследования нельзя создать определенный класс родитель, например:
Пусть у нас есть корзина с яблоками, грушами и апельсинами и нам нужно создать классы для описывающие их (в качестве описания просто выведем сбщ. в консоль методом i_called() // я называюсь)
Кто тогда будет классом родителем?
Наследовать апельсин от яблока – нелогично, равно как и от груши.
Для решения подобных вопросов и используются абстрактные классы, поэтому создается класс «фрукты» который будет иметь чисто виртуальный метод (иногда называют чистый виртуальный метод) virtual i_called(); который не будет иметь реализации.
Мы не можем создать объект класса в котором есть чисто виртуальный метод, следовательно вызвать метод Fruit.i_called(); не получится, но мы можем в каждом классе переопределить этот метод и создавать и вызывать эти классы наследники.
class Fruit
{
public:
virtual void i_called();
};
class Orange : public Fruit
{
void i_called() override
{
cout<<"I called orange"<<endl;
}
};
class Apple : public Fruit
{
void i_called() override
{
cout<<"I called apple"<<endl;
}
};
class Pear : public Fruit
{
void i_called() override
{
cout<<"I called pear"<<endl; } }; void PrintInfo(Fruit *somethink) { somethink->i_called();
}
В main напишем следующий код:
Orange c_Orange;
Orange c_Apple;
Orange c_Pear;
PrintInfo(&c_Orange); //например получим информацию о апельсине