为什么必须定义未使用的虚函数?

Ant*_*ant 5 c++ virtual function definition

我发现很遗憾,与未使用的普通函数不同,仍然必须定义未使用的虚函数.我对在创建类对象时创建的隐式vtablevpointer有所了解- 这有点回答了问题(必须定义函数以便可以定义指向虚函数的指针)但这会进一步推动我的查询仍然.

如果根本不可能调用虚函数,为什么需要为函数创建vtable条目?

class A{
    virtual bool test() const;
};

int main(){
    A a; //error: undefined reference to 'vtable for A'
}
Run Code Online (Sandbox Code Playgroud)

虽然我声明A::test()它从未在程序中使用但它仍然会引发错误.编译器是否可以不通过程序运行并且实现test()从未被调用 - 因此不需要vtable条目?或者这对编译器来说是不合理的事情?

Edw*_*nge 6

因为在编译器编写器上解决它将不可避免地成为一个非常难以解决的问题,所以当能够保持虚函数未定义的有用性时最多是可疑的.编译器作者肯定有更好的问题需要解决.

此外,即使你不打电话,你也在使用该功能.你正在拿地址.