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"; }
}