Итак, я новичок в изучении виртуальных функций и слежу за онлайн-уроками, и я не могу найти ответ на свой вопрос. Я хочу спросить, почему использование виртуальных функций, указанных ниже, путем установки объектов базового класса для указания на объекты производного класса, предпочтительнее, чем просто использование самих объектов производного класса для доступа к функциям?
Кажется, что я получаю один и тот же вывод, и кажется, что создание объектов базового класса и виртуальных функций - дополнительные шаги. Я видел пример, подобный этому, в онлайн-учебнике, в котором утверждалось, что виртуальные функции упрощают кодирование, но я не совсем вижу преимущества в этом примере?
Я читал в Интернете, что:
Основным преимуществом виртуальных функций является то, что они напрямую поддерживают объектно-ориентированное программирование. Когда вы объявляете функцию виртуальной, вы говорите, что то, какой именно код выполняется, зависит от типа объекта, для которого вы ее вызываете.
Но, похоже, это уже имеет место при использовании производных объектов, а что создавать объекты базового класса не нужно? Я уверен, что упускаю что-то очевидное, поэтому я был бы очень признателен за любую помощь. Я показал пример кода, который я написал ниже, который похож на то, что я видел при детализации виртуальных функций:
#include <iostream>
using namespace std;
//////////////////////////////////////////////////////
//base class
class Shape {
public:
virtual void draw()=0; //pure virtual function
};
//derived classes
class Square : public Shape {
public:
void draw() {
cout << "Draw square" << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Draw circle " << endl;
}
};
//////////////////////////////////////////////////////
int main()
{
Square so; //create derived class objects
Circle co;
Shape* shape1 = &so; //setting base class objects as pointers to derived objects
Shape* shape2 = &co;
shape1->draw(); //using base class objects to access derived class
shape2->draw();
so.draw(); //using derived class objects
co.draw();
}