在下面的代码段给我错误如果vtable是在编译时创建的,为什么这个错误是链接器错误而不是编译错误?
未定义参考`虚表为衍生”
代码:
#include <iostream>
class base{
public:
base(){}
virtual ~base(){}
virtual void test()
{
}
};
class Derived:public base{
public:
Derived(){}
~Derived(){}
void test();
};
int main() {
base* b = new Derived();
delete b;
}
我理解是因为虚拟温控功能test
在class Derived
中声明但未定义。
但是当我g++ -c file.cpp
编译其按thisçompile或汇编源文件,但不链接。它不会给我任何错误并编译好。因此,上述错误产生于链接时间而不是编译时间。 从我学到的不是在编译时创建的vtable
。那为什么我在编译时本身没有得到这个错误呢?
错误来自链接程序,因为时间的检查会显示给您。 – EJP
@EJP是的,我确实意识到这一点,并且对问题本身进行了描述。但我不明白的是,我不应该在编译时自己gettng而不是链接。 – Hummingbird
“编译时”的描述包括链接时间,但不包括运行时 –