c++ - 无法修复对 vtable 的 undefined reference

标签 c++ virtual vtable undefined-reference

我已经搜索了一段时间,找到了很多与我遇到的问题相关的线程/页面,但我找不到

  1. 解释为什么发生此错误
  2. 针对我的特定案例的有效解决方案

下面是Scanner.h:

class BaseReader {

    public:

    virtual ~BaseReader();

    virtual const char* read() = 0;
    virtual long position() = 0;
    virtual long size() = 0;
    virtual void seek(long position) = 0;

};

class CharReader : public BaseReader {

    public:

    CharReader(const char* source);
    CharReader(const char* source, long size);

    ~CharReader();

    const char* read();
    long position();
    long size();
    void seek(long position);

    private:

    char* _source;
    long _position;
    long _size;

};

Scanner.cpp 中,我简单地实现了 CharReader 的构造函数之一。

我使用 Code::Blocks,但自己编译它会导致完全相同的问题。

niklas@emerald:~/git/hiterator (CPP)$ g++ main.cpp hiterator/Scanner.cpp -o main
/tmp/cclNNwgl.o: In function `hiterator::CharReader::CharReader(char const*)':
Scanner.cpp:(.text+0x16): undefined reference to `vtable for hiterator::CharReader'
collect2: ld gab 1 als Ende-Status zurück

@qdii:

#include "Scanner.h"
using namespace hiterator;

#include <stdlib.h>
#include <string.h>

CharReader::CharReader(const char* source) {
    _size = strlen(source);
    _source = (char*) malloc(_size + 1);
    memcpy(_source, source, _size + 1);
}

最佳答案

您的程序不正确。所有虚函数都被视为已使用(odr-已使用),因此您需要为所有虚函数提供定义。解决该问题后,问题应该就会消失。

编译器提示 vtable 不可用。 Vtable-s 是一个实现细节,因此不受标准处理,但许多编译器会在定义第一个(非内联)虚函数的翻译单元中生成 vtable。在您的情况下,无论生成 vtable 的标准是什么,您都没有遵守它。

关于c++ - 无法修复对 vtable 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999158/

相关文章:

c++ - 无法获取返回 constexpr auto 的函数类型

c++ - 谁能解释为什么我的 crypto++ 解密文件短 16 个字节?

java - Netbeans(用于 c/c++ 的 MinGW 编译器)可以调用任意 C/C++ DLL(在 VS'05 中编译)吗?

c++ - 将字符串转换为字节数组

c++ - 如何在运行时决定将哪个派生类用作 C++ 中的私有(private)类成员?

batch-file - Virtual Audio Cable .bat 文件输出/输入设备语言错误

具有多父多态层次结构的 C++ VTable 实现

c++ - 不相关类型之间的 reinterpret_cast 和 virtual

c# - 覆盖虚拟方法时缺少返回类型协变的解决方法

c++ - 虚函数与指针转换的比较