Собака, 2-- кошка, иначе-- млекопитающее, 0-- выход. 0

Так как часто используется указатель на объект базового класса, хотелось бы иметь возможность удалять этот объект, к какому бы классу он не принадлежал, на самом деле, следовательно необходимо использовать виртуальные деструкторы в том случае если в классе объявлены виртуальные функции.

Конструктор не может быть виртуальным и не может быть виртуального конструктра-копировщика. Если требуется передать указатель на объект произвольного класса и правильно скопировать его можно использовать виртуальный метод Clone()— создающий и возвращающий копию объекта текущего класса.

Virtual Mammal* Mammal::Clone(){return new Mammal(*this);}

Virtual Mammal* Dog::Clone(){return new Dog(*this);}

Virtual Mammal* Cat::Clone(){return new Cat(*this);}

Существует цена виртуальных методов так как необходимо поддерживать v-таблицу ,( снижение быстродействия и затраты на память), а так же необходимость писать виртуальный деструктор. Поэтому необходимо обосновывать необходимость использования виртуальных методов ( если да, то какие именно).

Рекомендуется:

§ Используйте виртуальные методы только в том случае, если программа содержит базовый и производный классы.

§ Используйте виртуальный деструктор, если в программе был созданы виртуальные методы.

§ Не пытайтесь создать виртуальный конструктор.

При работе с виртуальными функция необходимо использовать одно и тоже имя, а так же списки аргументов и тип возвращаемого параметра, если это не выполняется, то механизм виртуальных функций игнорируется.