如何处理C++模板类场景下dynamic_cast转换与虚函数失效问题?
问题原因
你遇到的核心问题是对象切片(Object Slicing):
- 你声明的
Atlas<Animal>模板实例,底层存储的是Animal类型的栈式对象,而非基类指针/引用。 - 执行
AtlasAnimal[0] = a;赋值操作时,只会拷贝a中属于基类Animal的成员数据,派生类Bird特有的虚函数表信息、自定义实现都会被截断丢弃,此时AtlasAnimal[0]本质就是一个纯基类Animal实例,因此调用regn()会走基类逻辑,dynamic_cast转换为派生类也会因为类型不匹配抛出std::bad_cast异常。
解决方案
最简单的修复方式是修改模板类的存储类型为基类智能指针,避免对象切片:
步骤1:修改Atlas实例声明
将存储类型替换为std::unique_ptr<Animal>(如果需要共享所有权可以用std::shared_ptr),需要先引入<memory>头文件使用智能指针:
Atlas<std::unique_ptr<Animal>> AtlasAnimal(1);
步骤2:修改赋值逻辑
直接构造派生类智能指针存入容器:
AtlasAnimal[0] = std::make_unique<Bird>("Eagle");
步骤3:调用方法
此时虚函数可以正常分发,直接调用即可得到预期结果:
// 注意get_name是成员函数,要加括号 cout << AtlasAnimal[0]->get_name() << " " << AtlasAnimal[0]->regn();
额外注意事项
- 你当前代码中
Bird类的构造函数、析构函数名写为了Pasare,和类名Bird不一致,属于语法错误,需要统一类名和构造/析构函数名。 - 原始代码中
cout << AtlasAnimal[0].get_name漏写了函数调用括号,需要改为get_name()才能正常执行。
内容的提问来源于stack exchange,提问作者Dragos Polifronie
相关产品推荐
相关产品推荐

