text: При вызове виртуальной функции с аргументом по умолчанию тело функции берется у реального объекта, а значения аргументов по типу ссылки или указателя. class Animal { public: void /*невиртуальный*/ move() { std::cout << "This animal moves in some way" << std::endl; } virtual void eat() { std::cout << "Animal eat something!" << std::endl; } virtual ~Animal(){} // деструктор }; class Wolf : public Animal { public: void move() { std::cout << "Wolf walks" << std::endl; } void eat(void) { // метод eat переопределён и тоже является виртуальным std::cout << "Wolf eats meat!" << std::endl; } }; int main() { Animal* zoo = {new Wolf(), new Animal()}; for(Animal* a:zoo) { a->move(); a->eat(); delete a; // Так как деструктор виртуальный, для каждого // объекта вызовется деструктор его класса } return 0; } Вывод: This animal moves in some way Wolf eats meat!