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

rjm*_*ues 29 c++ inheritance vtable

档案啊

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif
Run Code Online (Sandbox Code Playgroud)

文件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
Run Code Online (Sandbox Code Playgroud)

和Child.cpp

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};
Run Code Online (Sandbox Code Playgroud)

编译器说对vtable有一个未定义的引用A.我尝试了很多不同的东西,但没有一个有效.

我的目标是将类A作为接口,并从头部分离实现代码.

Alo*_*ave 69

为什么错误以及如何解决?

您需要提供所有虚拟功能的定义class A.只允许纯虚函数没有定义.

即:在class A两种方法中:

virtual ~A();
virtual void doWork();
Run Code Online (Sandbox Code Playgroud)

应该定义(应该有一个正文)

例如:

A.cpp

void A::doWork()
{
}
A::~A()
{
}
Run Code Online (Sandbox Code Playgroud)

警告:
如果您希望自己class A充当接口(在C++中也称为Abstract类),那么您应该将该方法设为纯虚拟.

virtual void doWork() = 0;
Run Code Online (Sandbox Code Playgroud)

好读:

"虚拟表"是一个未解析的外部是什么意思?
在构建C++时,链接器说我的构造函数,析构函数或虚拟表是未定义的.


Mah*_*esh 6

我的目标是A成为一个接口,并从头部分离实现代码.

在这种情况下,将成员函数设置为A类中的纯虚函数.

class A {
  // ...
  virtual void doWork() = 0;
};
Run Code Online (Sandbox Code Playgroud)