Использование маркировки функции как виртуальной заключается в том, что вы просите компилятор отложить или выяснить «ТИП» объекта, вызывающего эту функцию во время выполнения, а не обычным способом «время компиляции». Это достигается с помощью указателей на объекты. Таким образом, чтобы выразить это в простой строке «Использовать указатели на объекты, чтобы использовать виртуальные функции».
оложим, у меня есть класс с виртуальной функцией и производный класс, который реализует виртуальную функцию другим способом. Предположим, у меня также есть вектор базового класса, используемый для хранения производных классов. Как мне выполнить виртуальную функцию производного класса в векторе, не зная заранее, что такое производный класс? Минимальный код, который иллюстрирует проблему:
#include <iostream>
#include <vector>
class Foo {
public:
virtual void do_stuff (void) {
std::cout << "Foo\n";
}
};
class Bar: public Foo {
public:
void do_stuff (void) {
std::cout << "Bar\n";
}
};
int main (void) {
std::vector <Foo> foo_vector;
Bar bar;
foo_vector.resize (1);
foo_vector [0] = bar;
bar.do_stuff (); /* prints Bar */
foo_vector [0].do_stuff (); /* prints Foo; should print Bar */
return 0;
}