template<class SpecificAnimal>
class Animal
{
public:
void who() { static_cast<SpecificAnimal*>(this)->Name(); }
};
class Dog : public Animal<Dog>
{
public:
const wchar_t* Name() const { return "Dog"; }
}
class Cat : public Animal<Cat>
{
public:
const wchar_t* Name() const { return "Cat"; }
}