新闻详情

新闻详情

首页 / 资讯中心 / 详情

派生类重写基类虚函数,需要有定义,否则报错undefined reference to vtable for Derived

发布时间:2026/9/29 15:08:07来源:尧图网络
派生类重写基类虚函数,需要有定义,否则报错undefined reference to vtable for Derived
一、源代码#includeiostream// /*structBase{virtualvoidf(){}};structDerived:Base{voidf()override;};intmain(){Base*pnew Derived;return0;}// *//* #include memory struct Base { virtual void f() {} //virtual ~Base() default; }; struct Derived : Base { void f() override {} }; int main() { std::unique_ptrBase p std::make_uniqueDerived(); p-f(); std::cout Derived class object is created and function f() is called. std::endl; } */二、报错信息g polymorph.cpp /usr/bin/ld: /tmp/ccLc7YZm.o: warning: relocation against_ZTV7Derivedinread-only section.text._ZN7DerivedC2Ev[_ZN7DerivedC5Ev] /usr/bin/ld: /tmp/ccLc7YZm.o: in function Derived::Derived():polymorph.cpp:(.text._ZN7DerivedC2Ev[_ZN7DerivedC5Ev]0x1f): undefined reference to vtableforDerived /usr/bin/ld: warning: creating DT_TEXTRELina PIE collect2: error: ld returned1exitstatus三、解析问题在第 9 行Derived::f()只有声明没有定义structDerived:Base{voidf()override;// 只声明没有函数体};为什么报的是undefined reference to vtable for Derived原因分析有虚函数的类都需要一张虚函数表vtable构造Derived对象时构造函数要把vptr指向vtable for Derived链接错误里的_ZTV7Derived。所以new Derived会让Derived::Derived()引用这张表。vtable 生成在哪个 .o 文件里GCC/Clang 遵循 Itanium C ABI 的key function关键函数规则类中第一个非内联、非纯虚的虚函数就是 key function。vtable只在定义了 key function 的那个编译单元里生成。Derived的 key function 是f()因为它是在类外定义不是 inline的。但你从来没有定义f()所以没有任何编译单元生成 vtable for Derived。所以链接器找不到 vtable就报了这个错报错里写的是缺 vtable而不是缺Derived::f()因为你的代码里没有直接调用f()。真正缺失的符号是 vtable缺f()的定义才是根本原因。另外两条 warningrelocation ... DT_TEXTREL in a PIE也是这个未解析符号带出来的不用单独处理。修复方法选一种方法 1在类内给出定义structDerived:Base{voidf()override{}};方法 2在类外定义通常写在 .cpp 里voidDerived::f(){}方法 3确实不需要重写就删掉这行声明顺带提一句Base没有虚析构函数。如果以后执行delete p;p是Base*实际指向Derived行为是未定义的。建议加上virtual~Base()default;源代码文件下半部分注释里那一版第 24 行已经写了这一行取消注释就行。当前代码没有delete所以还有一个内存泄漏。改用下面那版的std::unique_ptr可以同时避免这个问题。RecapThe goal is to getpolymorph.cppto link.It fails becauseDerived::f()is declared but never defined,so the vtable forDerivedis never generated. Next,add a body (void f() override {}) and recompile.
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MySQL InnoDB Cluster高可用实战:Router部署与故障排查 2026/9/29 16:12:53

MySQL InnoDB Cluster高可用实战:Router部署与故障排查

说实话,最开始我对MySQL InnoDB Cluster(简称MIC)是持保留态度的。早年搭过MHA、弄过半同步复制,总觉得官方这套东西太“重”——又是组复制又是Router又是Shell的,光名词就能劝退一批人。但真正被生产环境逼着把整套架…

阅读更多 →
MPAndroidChart可滑动柱状图实战:教务场景下的高性能优化方案 2026/9/29 16:12:53

MPAndroidChart可滑动柱状图实战:教务场景下的高性能优化方案

简介:本资源是一份面向Android开发者的实战型图表交互实现方案,聚焦于利用MPAndroidChart开源库构建支持手势滑动的柱状图,解决大数据量下图表横向浏览不畅的常见痛点,适用于金融数据展示、日志统计分析、IoT设备监控等需动态查看…

阅读更多 →
自动分区+冷分区迁移+压缩:Oracle流水表存储与查询性能优化实践 2026/9/29 16:12:53

自动分区+冷分区迁移+压缩:Oracle流水表存储与查询性能优化实践

接手过一张按天自动分区的流水表之后,我是真的体会到了“自动分区很省心,但省不了心”。自动分区帮你把“每个月/每天手工建分区”的重复劳动干掉了,可它不会替你考虑:旧分区还在昂贵的存储上躺着,查询还是会扫过大量历…

阅读更多 →
Oracle自动分区只是开始:冷分区压缩与治理方案实践 2026/9/29 16:12:53

Oracle自动分区只是开始:冷分区压缩与治理方案实践

先聊个真实场景。我有个朋友维护一套业务流水库,表是按月自动分区的,INTERVAL分区用得很溜,写入从不需要人工干预。结果半年后他发现两个问题:一是磁盘快满了,历史分区谁都没碰过,却占了整个库一大半空间&a…

阅读更多 →
数据结构栈和队列核心详解:从受限线性表到系统栈与消息队列 2026/9/29 16:12:53

数据结构栈和队列核心详解:从受限线性表到系统栈与消息队列

数据结构这门课有个很典型的感受:前面学顺序表、链表的时候,你觉得是在学“怎么把数据存起来”,存得整齐、找得快就行。但一学到栈和队列,画风突然变了——同样是线性表,它开始教你不允许随便存、不允许随便取。我第一…

阅读更多 →
Windows 11 24H2 下 S7-PLCSIM 驱动签名问题修复指南 2026/9/29 16:12:47

Windows 11 24H2 下 S7-PLCSIM 驱动签名问题修复指南

1. 问题背景与影响范围 Windows 11 24H2 这个版本,微软在内核层面动了些东西,尤其是驱动签名强制策略和内核隔离相关的默认配置,导致一批老版本工业软件的虚拟驱动直接趴窝。S7-PLCSIM V5.0 就是重灾区之一。这个软件在自动化圈子里什么地位不…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉