#include <iostream>
using namespace std;

class AbstractArray{   //<-- new class
     public: virtual void* get(int index)=0;
};

template<class T1> class MyArray : public AbstractArray{ //<-- modify
	T1* internal[20];
	public: T1* get(int index){return internal[index];}
	public: void set(int index,T1* t1){internal[index]=t1;}
};
template<class T2> class User{
	public: AbstractArray* arrayPtr;
	public: T2* getTheBestT2(){
		int bestIndex=0;
		//.... some code to find the "bestIndex" ....
		void* t1=arrayPtr->get(bestIndex);
		T2* t2=static_cast<T2*>(t1); 
		return t2;
	}
};
class Animal{public: int testAnimal=42;};
class Dog:public Animal{public: int testDog=41;};
int main() {
	User<Dog> user;
	MyArray<Animal> array;
	array.set(0,new Dog());
	user.arrayPtr = &array;
	Dog* dog=user.getTheBestT2();
	std::cout<<dog->testDog<<std::endl;
	std::cout<<dog->testAnimal<<std::endl;
	return 0;
}