Хорошо, немного сложно, но разрешается во время компиляции:
template <class _Derived>
class Animal
{};
class Dog: public Animal<Dog>
{
public:
void Feed()
{
cout<<"Feeding Dog...";
}
};
class Cat: public Animal<Cat>
{
public:
void Feed() { /* Feed Cat*/ }
};
И реализовать ОДНУ шаблонную функцию:
template<class _AnimalType>
void FeedAnimal(_AnimalType& animal)
{
animal.Feed();
}
Создать экземпляр любого класса и вызвать FeedAnimal :
Dog dog;
Cat cat;
FeedAnimal(dog);
FeedAnimal(cat);
Если Feed не реализован производный-класс , вы не сможете получить ошибку, пока не вызовете функцию шаблона Feed. Поэтому, если Lion реализован так:
class Lion : public Animal<Lion>
{};
Вы не получите никакой ошибки, которой нет в Feed. Как только вы сделаете вызов FeedAnimal с Lion, вы получите сообщение об ошибке, что у Lion отсутствует метод Feed.
Это один из способов убедиться, что производный класс реализует Feed:
template <class _Derived>
class Animal
{
void (_Derived::*pDummy)();
public:
Animal()
{
pDummy = &_Derived::Feed;
}
};
Грязно, но работает!