我能告诉你';“vtable”的未定义引用是什么? 我有一个C++类,用来模仿C的接口,比如: class Foo { public: virtual void baa(); } 这是一个编译Queon on释放的大型QtC++项目,但是我在调试模式下编译时得到了这个错误:

我能告诉你';“vtable”的未定义引用是什么? 我有一个C++类,用来模仿C的接口,比如: class Foo { public: virtual void baa(); } 这是一个编译Queon on释放的大型QtC++项目,但是我在调试模式下编译时得到了这个错误:,c++,qt,mingw,undefined-reference,virtual-functions,C++,Qt,Mingw,Undefined Reference,Virtual Functions,对vtable的未定义引用 我知道这个错误的意思:没有定义虚拟方法,对吗?我的问题是: 它只在调试时发生,我不知道为什么。我能找到我没有定义该方法的源(即类)吗 我愿意使用Qt本身、编译器选项、外部工具或其他任何东西 我能找到我没有定义该方法的源(即类)吗 对我来说,第一个嫌疑犯是类Foo本身。检查其中是否包含void baa()的定义。如果未定义Foo::baa(),则无法执行以下操作: Foo foo; foo.baa(); // undefined reference for `Foo:

对vtable的未定义引用

我知道这个错误的意思:没有定义虚拟方法,对吗?我的问题是:

它只在调试时发生,我不知道为什么。我能找到我没有定义该方法的源(即类)吗

我愿意使用Qt本身、编译器选项、外部工具或其他任何东西

我能找到我没有定义该方法的源(即类)吗

对我来说,第一个嫌疑犯是
类Foo
本身。检查其中是否包含
void baa()
的定义。如果未定义
Foo::baa()
,则无法执行以下操作:

Foo foo;
foo.baa();  // undefined reference for `Foo::baa()`
现在,如果您确实定义了
Foo::baa()
,那么可能是
Foo
的其他子类出现了这个错误(但是我注意到g++提到了哪个子类,奇怪的是为什么您看不到它)

一种简单的方法是临时将
Foo::baa
设置为
虚拟

class Foo {
public: virtual void baa () = 0;
};
在这种情况下,无论哪个子类不重写此方法,都将生成编译器错误。由于行号等原因,这将使您的查找更容易


为什么它在调试模式下给出链接器错误是非常主观的,需要更多信息。

您使用的是哪种编译器,您可以发布用于调试和发布的编译器命令吗?通常这意味着您声明了一个
虚拟
函数,但没有提供主体。除纯虚函数外,所有虚函数都必须有实体。即使它们没有被调用。@M.M,尽管为所有
virtual
方法提供主体是很好的,但准确地说,只需要那些包含类对象的方法主体被实例化。例如,如果我有
类B
及其派生的
类D
。如果我没有创建
B
的任何对象并调用
virtualvoid f()然后我仍然可以使用未定义的
虚拟
方法。顺便说一句,在纯
virtual
方法的情况下,即使主体不是强制性的,也可以在类主体之外定义它。@iammilind instanting
D
实例化
B
@M.M,通过
D
实例化
B
,甚至显式实例化
B
仍然可以。但是,不应该出现这样的情况,即最终通过
B&
B*
B
调用
virtual f()
。只有在这种情况下,链接器错误才会弹出。在这一点上,我试图涵盖几个案例。
class Foo {
public: virtual void baa () = 0;
};