c++ 继承问题:未定义对“vtable”的引用

Posted

技术标签:

【中文标题】c++ 继承问题:未定义对“vtable”的引用【英文标题】:c++ inheritance issues: undefined reference to 'vtable' 【发布时间】:2018-01-16 05:21:14 【问题描述】:

全部!我正在尝试使用 C++ 和头文件创建一个非常简单的继承结构,但是(当然)我遇到了一些困难。

当我尝试编译我的主程序时,我得到了这个错误:

In function `Base::Base()':
undefined reference to 'vtable for Base'
In function `Derived::Derived()':
undefined reference to 'vtable for Derived'

我只想打印

printed in Derived

但我遇到了一些极端困难。

这是我的程序文件:

ma​​in.cpp

#include <iostream>
#include "Base.h"
#include "Derived.h"

using namespace std;

int main(void) 
    Base *bp = new Derived;
    bp->show();
    return 0;

Base.cpp

#include <iostream>
#include "Base.h"

virtual void Base::show() 
    cout << "printed in Base";

Base.h

#ifndef BASE_H
#define BASE_H

class Base 
    public:
        virtual void show();
;

#endif

Derived.cpp

#include <iostream>
#include "Derived.h"

using namespace std;

void Derived::show() override 
    cout << "printed in Derived";

Derived.h

#ifndef DERIVED_H
#define DERIVED_H

class Derived: public Base 
    public:
        void show() override;
;

#endif

谢谢!非常感谢任何帮助!...非常感谢。

【问题讨论】:

你使用的是什么编译器,你是如何编译的? 我在linux终端上使用g++ 好的,你回答了一半的问题...... 那么,你还没有编译其他两个文件? Related. 【参考方案1】:

正如 cmets 中所指出的,通过调用 g++ main.cpp,您只是在编译 main.cpp

您需要编译所有文件,然后将它们链接在一起。如果这样做,您将看到其他 cpp 文件中存在编译问题,正如 cmets 中所指出的那样(虚拟和覆盖仅属于标题)。

所以你需要调用以下来编译所有文件: g++ main.cpp Base.cpp Derived.cpp -o myapp

【讨论】:

g++ *.cpp -o 输出和(有错误)但现在它编译了。

以上是关于c++ 继承问题:未定义对“vtable”的引用的主要内容,如果未能解决你的问题,请参考以下文章

对“vtable”的未定义引用

Qt C++ Q_OBJECT 错误未定义对 vtable 的引用

error:对‘vtable for new_sequence’未定义的引用 对‘typeinfo for num_sequence’未定义的引用

链接器错误:未定义对“QGLViewer 的 vtable”的引用

使用 Qt 对 vtable 的未定义引用

由于交叉编译树莓派,未定义对“Adafruit_GFX 的 vtable”的引用