当我有这样的事情时:
class A
{
virtual void rat();
};
class B : public A
{
virtual void rat() { ; } //implemented!
};
int main(int argc, char **argv)
{
A *a = new B;
delete a;
}
我收到链接器错误:
除非我把基础老鼠变成纯虚拟的。
但是,当我有这个时:
class A
{
public:
void rat();
};
int main(int argc, char **argv)
{
A a;
}
这编译得很好并且不会给我一个 undefined reference 链接错误,除非我明确地尝试在我的 main (
a.rat();
) 中调用 rat 函数。但是,在派生类中实现的未实现的基类虚函数的规则是什么,如第一个失败的代码片段? 最佳答案
当两个类都定义了虚函数时,C++ 编译器需要为 A
和 B
两个类构建 vtables 。要构建 A
的 vtable,编译器需要 A::rat()
- 这是引用的来源。
当 A
没有虚函数时,任何地方都没有对 A::rat
的引用,因此不会出现编译错误。
我相信您知道,您可以通过将 A::rat
设为纯虚拟来修复此错误,从而为 vtable 提供所需的值(在本例中,该值为零)。
关于c++ - 为什么链接器在虚拟情况下给我一个错误而不是在非虚拟情况下?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10455131/