You need to enable JavaScript to run this app. 如何处理C++模板类场景下dynamic_cast转换与虚函数失效问题?
优惠活动
大模型
产品
解决方案
定价
更多

如何处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 03:45:07