C++ 未定义对 vtable 和继承的引用

标签 c++ inheritance vtable

文件 A.h

#ifndef A_H_
#define A_H_

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

#endif

文件 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 类成为一个接口(interface),并将实现代码与 header 分开。

最佳答案

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

您需要提供 definitions 用于 class A 中的所有虚函数。只有纯虚函数才允许没有定义。

即:在 class A 两种方法:

virtual ~A();
virtual void doWork();

应该被定义(应该有一个主体)

例如:

A.cpp

void A::doWork()
{
}
A::~A()
{
}

警告:
如果您希望您的 class A 充当接口(interface)(在 C++ 中也称为 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.

关于C++ 未定义对 vtable 和继承的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406580/

相关文章:

visual-c++ - Visual C++ 2015 虚表汇编输出的困惑

c++ - 崩溃报告中的 CPU 寄存器地址对分析有何帮助?

java - 为什么bark方法无法调用

c++ - 函数返回指向自身的指针?

c# - 使用派生类的实例时如何序列化基类?

java - 构造函数中的可重写方法调用有什么问题?

c++ - QObject 创建 moc 文件,但仍然出现 vtable 错误

c++ - 获取对象成员的大小

c++ - 带有类名的可变参数模板

c++ - 静态线程函数访问 C++ 中的非静态类成员