Так как часто используется указатель на объект базового класса, хотелось бы иметь возможность удалять этот объект, к какому бы классу он не принадлежал, на самом деле, следовательно необходимо использовать виртуальные деструкторы в том случае если в классе объявлены виртуальные функции.
Конструктор не может быть виртуальным и не может быть виртуального конструктра-копировщика. Если требуется передать указатель на объект произвольного класса и правильно скопировать его можно использовать виртуальный метод 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-таблицу ,( снижение быстродействия и затраты на память), а так же необходимость писать виртуальный деструктор. Поэтому необходимо обосновывать необходимость использования виртуальных методов ( если да, то какие именно).
Рекомендуется:
§ Используйте виртуальные методы только в том случае, если программа содержит базовый и производный классы.
§ Используйте виртуальный деструктор, если в программе был созданы виртуальные методы.
§ Не пытайтесь создать виртуальный конструктор.
При работе с виртуальными функция необходимо использовать одно и тоже имя, а так же списки аргументов и тип возвращаемого параметра, если это не выполняется, то механизм виртуальных функций игнорируется.