c未定义对vtable的引用

新手上路,请多包涵

我正在学习 C++。我正在尝试做一个练习,我用一个函数定义一个纯虚拟类的几个实现。我无法链接使用这些实现的类。

 ==> BasicMath.h <==
#ifndef BASIC_MATH_H
#define BASIC_MATH_H

#include<string>
#include<vector>

class BasicMath { };

#endif // BASIC_MATH_H

==> Operation.h <==

#ifndef OPERATION
#define OPERATION

#include<string>
#include<vector>

class Operation {
 public:
  virtual void perform(std::vector<std::string> vec) = 0;
};

#endif // OPERATION

==> Sum.h <==
#ifndef SUM_H
#define SUM_H

#include "Operation.h"

class Sum: public Operation {
 public:
  void perform(std::vector<std::string> vec);
};

#endif // SUM_H

==> BasicMath.cpp <==
#ifndef BASIC_MATH_C
#define BASIC_MATH_C

#include <string>
#include <vector>
#include <iostream>
#include "BasicMath.h"
#include "Sum.h"

int main(int argc, char* argv[]) {
  Sum op;
}

#endif // BASIC_MATH_C

==> Sum.cpp <==
#ifndef SUM_C
#define SUM_C

#include <vector>
#include <string>
#include <iostream>
#include "Sum.h"

void Sum::perform(std::vector<std::string> vec) {
    using namespace std;
    int total = 0;
    cout << "Total: " << total << "\n";
};

#endif // SUM_C

汇编:

 $ g++ -c Sum.cpp
$ g++ -o BasicMath BasicMath.cpp
/tmp/cc1VXjNl.o:BasicMath.cpp:(.text$_ZN3SumC1Ev[Sum::Sum()]+0x16): undefined reference to `vtable for Sum'
collect2: ld returned 1 exit status

我有 95% 的把握我在这里至少做了一件愚蠢的事情——但我的大脑拒绝告诉我是什么。

我已经看到 了这个 问题,但没有设法解决我的问题。

原文由 Ben Fitzgerald 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 535
2 个回答

您没有在 compile&link 行中包含 Sum.o 目标文件(第二次使用 g++)。

原文由 Edward Strange 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您忘记纯虚函数的 = 0 也会发生该错误

错误:

 class Base {
    public:
        virtual void f();
};

class Derived : public Base {
    public:
        virtual void f() {}
};

int main() {
    Derived d;
    Base *b = &d;
    (void)b;
}

没有错误:

 class Base {
    public:
        virtual void f() = 0;
};

这是因为没有 = 0 ,C++ 不知道它是纯虚函数,将其视为声明,期待稍后的定义。

g++ 5.2.1 上测试。

从 GCC 11.2.0 开始测试,错误消息更改为:

 undefined reference to `typeinfo for Base'

命令:

 g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题