我应该如何处理模板类的动态转换?

问题描述

我有一个模板类,它将存储来自基类的派生类的对象,例如:模板类向量、基类 b、派生类 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.

我不知道如何处理这个问题,因为覆盖函数 regn 效果很好; cout<<a.regn() 根据需要打印 "BIRD" 。 我试着做一个 dynamic_cast 如图所示:

cout << AtlasAnimal[0].get_name << " " << (dynamic_cast<Bird&>AtlasAnimal[0]).regn(); 但它失败了,说 terminate after throwing instance of : std::bad_cast

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...