我觉得很奇怪,未使用的虚拟函数仍然必须定义,而不像未使用的普通函数。我对含蓄的vtable和vpointers有些了解,它们是在创建类对象时创建的 - 这有点回答了问题(该函数必须被定义,以便可以定义指向虚函数的指针),但是这会推动我的查询还在后面。为什么必须定义未使用的虚拟功能?
如果根本没有虚拟函数被调用的可能,为什么需要为函数创建一个条目vtable?
class A{
virtual bool test() const;
};
int main(){
A a; //error: undefined reference to 'vtable for A'
}
即使我宣布A::test()
这是从来没有在程序中使用,但它仍然抛出了一个错误。编译器是否可以不运行程序,并且实现从未调用test()
- 因此它不需要vtable条目?或者这是对编译器期望的不合理的事情?
你不能实例化一个虚拟类。但是创建一个空函数或仅仅返回其声明类型的常量是很简单的。 – Logicrat