не забываем о виртуальном деструкторе в class Animal, а то потом кучу геморроя заимеем
ps. для скорости я убираю virtual в методах которые мне явно не понадобится переопределять, а virtual ... = 0 находится только в декларациях методов интерфейса
те так :
class WildBoar : public Animal {
public:
WildBoar(short h);
Animal* Create(); // Может производить сородичей
};
теперь если мы вызываем вот это :
Animal * foo = new WildBoar;
...
foo->Create();
то во второй строчке произойдет обращение к виртуальной таблице методов, и вызов метода по смещению от туда
но если написать так :
Animal * foo = new WildBoar;
...
WildBoar * bar = static_cast<WildBoar*>(foo); // мы уверенны на все 100% что это WildBoar
bar->Create();
то вызов bar->Create(); выполнится напрямую, смещение метода посчитается во время компиляции и не будет никаких тормозов
хочу заметить что в данном случае нет никакого RTTI, и его использовать тоже не стоит (так же как и try...catch), в геймдеве рискуют статическим методом предоставления безопасности кода, а пользуются здравым смыслом