我觉得很奇怪的是,与未使用的普通函数不同,未使用的虚拟函数仍然必须被定义。我对隐含的内容有些了解vtables and v指针它们是在创建类对象时创建的 - 这在某种程度上回答了这个问题(必须定义该函数,以便可以定义指向虚函数的指针),但这将我的查询进一步推回。
为什么会有一个vtable如果根本不可能调用虚函数,是否需要为函数创建条目?
class A{
virtual bool test() const;
};
int main(){
A a; //error: undefined reference to 'vtable for A'
}
尽管我声明A::test()
它从未在程序中使用过,但仍然会抛出错误。编译器能否不运行程序并实现test()
从未被调用过 - 因此不需要vtable条目吗?还是对编译器的期望是不合理的?
因为对于编译器编写者来说,这将不可避免地成为一个非常困难的问题,因为当能够使虚拟函数未定义的有用性充其量是可疑的时。编译器作者肯定有更好的问题需要解决。
此外,即使您没有调用该函数,您也正在使用该函数。你正在获取它的地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)