问题描述
我有一个模板类,它将存储来自基类的派生类的对象,例如:模板类向量、基类 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 (将#修改为@)