档案A.h
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
File Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
和Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
编译器说对A
的vtable有一个未定义的引用。
我尝试了很多不同的东西,但没有一个有效。
我的目标是让班级A
成为一个接口,并从标题中分离实现代码。
答案 0 :(得分:67)
为何错误&如何解决?
您需要为class A
中的所有虚拟功能提供 definitions 。只允许纯虚函数没有定义。
即:class A
两种方法:
virtual ~A();
virtual void doWork();
应该定义(应该有一个正文)
例如:
<强> A.cpp 强>
void A::doWork()
{
}
A::~A()
{
}
<强>警告:强>
如果您希望class A
充当C ++中的界面(a.k.a Abstract class ),那么您应该将该方法设为纯虚拟。
virtual void doWork() = 0;
好读:
What does it mean that the "virtual table" is an unresolved external?
When building C++, the linker says my constructors, destructors or virtual tables are undefined.
答案 1 :(得分:6)
我的目标是让A成为一个接口,并从头文件中分离实现代码。
在这种情况下,将成员函数作为A类中的纯虚函数。
class A {
// ...
virtual void doWork() = 0;
};
答案 2 :(得分:2)
请务必删除任何&#34; *。gch&#34;文件,如果其他任何回复都没有帮助你。