【问题标题】:Undefined reference to vtable in constructor构造函数中对 vtable 的未定义引用
【发布时间】:2017-11-10 14:42:24
【问题描述】:

首先,我知道有很多关于这个的问题,但我没有找到解决方案,所以我决定写它。

我正在开发一个 C++ 项目,我需要使用多态性。为了解决我的问题,我将其简化为两个类:Parent 和 Child。 Parent 只有虚方法,而 Child 必须实现它们。唯一将被实例化的类是 Child。所以,这里是代码:

父母.hh

namespace ParentNamespace {
class Parent {
    public:
        Parent();
        ~Parent();
        virtual int Start() = 0;
    };
}

父母.cc

#include "Parent.hh"
using namespace ParentNamespace;
namespace ParentNamespace { 
    Parent::Parent(){}
    Parent::~Parent(){} 
}

孩子.hh

#include "Parent.hh"
namespace ChildNamespace {
    class Child : public ParentNamespace::Parent {
        public:
            Child();
            ~Child();
            int Start();
    };
}

Child.cc

#include "Child.hh"
namespace ChildNamespace {
    Child::Child(){}
    Child::~Child(){}   
    int Start(){
        return 0;
    }
}

它编译没有错误(它生成 .o 文件),但是当它必须链接它们时,它会显示以下错误:

在函数ChildNamespace::Child::Child(): Child.cc:8: 中未定义对ChildNamespace::Child 的vtable 的引用

我已经尝试过其他问题的回答,但没有成功。我想我看不到简单的东西,所以请帮忙!

提前致谢。

【问题讨论】:

  • @Nepho 我已经看过了,还有几十个类似的,它没有帮助......最后,当你开始写标题时,它显示了类似的问题。还是谢谢你。
  • 那么,你能发布你的 Makefile 的内容/你用来编译文件的命令吗?应该不难看出错误在哪里。
  • Parent的析构函数设为虚拟。
  • 另外,它是int Child::Start() 而不是int Start()

标签: c++ inheritance linker-errors vtable


【解决方案1】:

需要实现纯虚函数,添加 Child:: 开始方法 在 Child.cc 中

 #include "Child.hh"
 namespace ChildNamespace {
     Child::Child(){}
     Child::~Child(){}   
     int Child::Start(){
         return 0;
     }
 }

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2020-07-07
    • 2015-05-25
    • 2014-06-05
    • 2016-09-26
    • 2012-08-18
    相关资源
    最近更新 更多