C ++ Undefined对vtable和继承的引用

时间:2012-02-23 03:06:46

标签: c++ inheritance vtable

档案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成为一个接口,并从标题中分离实现代码。

3 个答案:

答案 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;文件,如果其他任何回复都没有帮助你。