I got a template class that will store objects of derived classes from a base class, as an example: Template class vector, base class b, derived class d.
class Animal {
protected:
    std::string m_name;
public:
    Animal() {}
    Animal (std::string name): m_name {name} {}
    virtual void set_name(std::string name) {m_name = name;}
    virtual std::string get_name () {return m_name;}
    virtual std::string regn()  const { return "???"; }
    virtual ~Animal(){
    cout << "Destructor animal"<<'\n';}
};
class Bird: public Animal {
public:
    Pasare() : Animal(){}
    Pasare(std::string name)
        : Animal{ name }{}
    void set_name (std::string nume){
    m_name = nume;}
    std::string get_name(){
    return m_name;}
    std::string regn()  const override {return "BIRD";}
     ~Pasare (){
    cout << "destructor pasare"<<'\n';}
 };
template <class T>
class Atlas
{
private:
    int m_length{};
    T* m_data{};
public:
    void SetLungime(int j);
    Atlas(int length)
    {
        assert(length > 0);
        m_data = new T[length]{};
        m_length = length;
    }
    Atlas(const Atlas&) ;//= delete;
    Atlas& operator=(const Atlas&);// = delete;
    ~Atlas()
    {
        delete[] m_data;
    }
    void erase()
    {
        delete[] m_data;
        m_data = nullptr;
        m_length = 0;
    }
    T& operator[](int index)
    {
        assert(index >= 0 && index < m_length);
        return m_data[index];
    }
    int getLength() const;
};
template <class T>
int Atlas<T>::getLength() const 
{
  return m_length;
}
template <class T>
void Atlas<T>::SetLungime(int j){m_length = j;
m_data = new T[j];
}
int main () {
Atlas<Animal> AtlasAnimal(1);
Bird b{"Eagle"};
Animal &a{b};
AtlasAnimal[0] = a;
cout << AtlasAnimal[0].get_name << " " << AtlasAnimal[0].regn();  -- This prints "Eagle", 
which is good and "???" instead of "BIRD" as i wanted.
I don't know how to handle this, cause overriding the function regn works well; cout<<a.regn() prints "BIRD" , as wanted.
I tried to do a dynamic_cast as shown:
cout << AtlasAnimal[0].get_name << " " << (dynamic_cast<Bird&>AtlasAnimal[0]).regn();
but it fails, saying terminate after throwing instance of : std::bad_cast
