undefined reference to `vtable
admin
2024-01-31 23:27:46
0

c++ 编译错误

undefined reference to vtable
undefined reference to Abstract_base::~Abstract_base()

c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\ssas0e\AppData\Local\Temp\ccwtXlSL.o:abstract_class.cpp:(.text$_ZN13Abstract_baseC2Ev[__ZN13Abstract_baseC2Ev]+0xa): undefined reference to `vtable for Abstract_base'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\ssas0e\AppData\Local\Temp\ccwtXlSL.o:abstract_class.cpp:(.text$_ZN17derived_from_baseC1Ev[__ZN17derived_from_baseC1Ev]+0x4d): undefined reference to `Abstract_base::~Abstract_base()'
c:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: C:\Users\ssas0e\AppData\Local\Temp\ccwtXlSL.o:abstract_class.cpp:(.text$_ZN17derived_from_baseD1Ev[__ZN17derived_from_baseD1Ev]+0x3e): undefined reference to `Abstract_base::~Abstract_base()'

错误代码示例子

#include using namespace std;class Abstract_base
{public:virtual ~Abstract_base();virtual void interface() const{};};class derived_from_base : public Abstract_base
{public:derived_from_base(){cout <<"derived ctor" << endl;}~derived_from_base() override{cout << "~ derived dtor" << endl;}void interface() const override{}};int main()
{derived_from_base b;return 1;
}

分析

vtable是虚函数表,报错说的是 undefined reference to
就是说,指向这个表的reference是未定义的。
为什么? 这个表不存在? 还是reference不存在?

子对象构造的过程

derived_from_base b 开始构造时候,先构造父类的,然后构造自己的,是一种自上而下的过程。我们看到编译的错误也是先父类出的问题,然后是子类出的问题。

父类哪里出的问题?
我们看下父类构造virtual fucntion过程。

  • 每一个class 产生出一堆指向virtual functions的指针,放在表格中。这个表格称为virtual table vtbl
  • 每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr. vptr的设定和重置都是由每一个class的constructor 和destructor和copy assignment运算符自动完成的。每个class所关联的type_infor_object(用以支持runtime type identification)也经由virtual table被指出来,通常放在表格的第一个slot.

国外一个针对此问题更加详细的讨论
总结下

  • look at your class definition. Find the first non-inline virtual function that is not pure virtual (not “= 0”) and whose definition you provide (not “= default”).

    If there is no such function, try modifying your class so there is one. (Error possibly resolved.)
    See also the answer by Philip Thomas for a caveat.

  • Find the definition for that function. If it is missing, add it! (Error possibly resolved.)

    If the function definition is outside the class definition, then make sure the function definition uses a qualified name, as in ClassName::function_name.

  • Check your link command. If it does not mention the object file with that function’s definition, fix that! (Error possibly resolved.)

  • Repeat steps 2 and 3 for each virtual function, then for each non-virtual function, until the error is resolved. If you’re still stuck, repeat for each static data member.

回到最初问题

上述代码的错误,是未定义function,只是声明。所以function pointer应该没产生成功,更别说后面的virtual table了。

相关内容

热门资讯

我国首个全国产控制系统水光互补... 据国资委官网消息,近日我国首个全国产控制系统水光互补项目——华能小湾水光互补项目在云南正式投运,标志...
2026快手创新与知识产权白皮... 快手以技术创新链与产业应用链双螺旋为核心架构,搭配知识产权支撑体系,形成 AI 时代完整的创新与价值...
被救活了!澳洲这个知名网购平台... 好消息!Click Frenzy被救活啦! Click Frenzy,是澳洲一个线上大促平台,前段时...
追觅CEO俞浩一天发了117条... 近日,追觅科技CEO俞浩在个人社交平台开启超高强度更新模式。短短三天时间里,他在多个社交平台密集发布...
“红利+”策略指数走势分化,价... 5月6日早盘,市场震荡上行,科技成长方向表现强势,“红利+”策略指数走势分化。截至午间收盘,国证自由...
工业增加值增速创五年新高 福田... 凭借在人工智能领域的深耕,企业扎堆的福田区的天使荟·千模应用加速器不仅摘得深圳多项荣誉,更于近日获评...
原创 敢... 大家好,我是言叔。最近,79岁的“玻璃大王”曹德旺在公开场合放出一句霸气十足的狠话——面对美国可能加...
原创 丧... 溃败边缘狗急跳墙!泽连斯基攻击自家核电站,要拉欧洲同归于尽。战场即将崩盘、停战必死无疑,泽连斯基早已...
A股大涨,超4000只个股上涨... 五一小长假后首个交易日,A股三大指数集体高开,其中,上证指数高开0.57%,深证成指高开1.43%,...
五粮液的大戏,只是拉开序幕 4月30日,赶在五一假期前最后一个交易日,趁着全国人民准备出门旅游的当口,五粮液甩出了多份公告。 其...
原创 存... 这几天发生了不少大事,我们简单捋一捋。三部门放大招,要扩大科技创新贷款投放。 美国对欧盟汽车加征25...
A2奶粉因检出“呕吐毒素”在美... 北京5月5日电(记者 赵方园)新西兰乳企a2牛奶公司卷入蜡样芽孢杆菌毒素召回风波。 5月3日晚,中国...
新股消息 | 从招股书看好医生... 智通财经APP获悉,当市场仍习惯用“传统互联网医疗平台”甚至“传统医药流通渠道”来理解好医生云医疗时...
科创50指数大涨超8% 半导体... 上证报中国证券网讯 5月6日,A股主要股指早盘集体走强。截至午间收盘,沪指涨1.27%,深证成指涨2...
体验经济蓬勃发展,“五一”假期... 今年劳动节假期,部分省市放春假提前预热“假日经济”,传统热门目的地客流量持续增长,曾经的“小众目的地...
互学互鉴促合作 携手共赢谋发展... 5月4日,新乡市工商联“新商课堂”九期班开展企业互访活动。 首站参访了新乡市瑞龙商贸有限公司,该企...
港股异动|诺比侃大跌15.8%... 诺比侃(2635.HK)大幅下跌15.8%,现报20.24港元股价再度逼近上市低位,市值76.7亿港...
文远知行股权曝光:韩旭持股6.... 雷递网 雷建平 5月6日 文远知行(WeRide)日前发布截至2025年12月31日的年报。年报显示...
马斯克同意支付超1000万元罚... 美国证券交易委员会(SEC)与马斯克就收购推特期间的违规诉讼达成和解,相关法庭文件正式提交。 根据协...
大盘放量上攻,全市场半日成交额... 5月6日早盘,A股三大指数集体走强,沪指涨1.27%,冲击五连阳,全市场成交额超2万亿元,较上一交易...