error: undefined reference to 'vtable for

本文介绍了一个关于C++编程中虚函数表未定义引用的错误案例。具体错误为尝试使用未完全定义的派生类作为基类的实例。通过提供具体的代码示例,详细分析了错误产生的原因,并给出了相应的解决方案。

A.h:

class ProcessCB

{
public:
virtual ~ProcessCB(){};
virtual void onCallback(int result) = 0;

};


B.h:

class DefogDH: public ProcessCB {
public:
virtual void onCallback(int result);
};


B.cpp:

    DefogDH* mDefogDH;
   mDefogDH = new DefogDH();


编译报错:

error: undefined reference to 'vtable for


解决方法:

添加:

void PrivateDefog::DefogDH::onCallback(int result){}

### 关于 C++ 中 “undefined reference to vtable” 错误的解决方案 当遇到 "undefined reference to vtable" 这样的编译错误时,通常意味着存在一些与虚拟表(vtable)有关的问题。这类问题可能由多种原因引起,具体取决于代码结构和项目配置。 #### 虚函数未实现 如果派生类继承自含有纯虚函数的基础类,则必须确保所有非纯虚成员函数都已提供具体的实现[^3]。例如: ```cpp class Father { public: virtual void function() const = 0; }; class Child : public Father { public: Child(unsigned int data) : mData(data) {} // 必须为父类中的抽象方法提供实际定义 void function() const override {}; private: unsigned int mData; }; ``` 上述例子中,在`Child` 类里实现了来自 `Father` 的纯虚函数 `function()` ,从而避免了链接阶段可能出现的相关错误。 #### 构造/析构函数缺失 另一个常见原因是基类或子类里的某些特殊成员函数(如构造器、析构器)未能正确定义。即使这些函数为空也应显式声明并给出主体[^4]: ```cpp // 正确的做法是在头文件内至少给定默认实现 virtual ~BaseClass() = default; // 或者在源文件(.cpp)中这样写: BaseClass::~BaseClass(){} ``` 这样做可以防止由于缺少必要的符号而导致链接失败的情况发生。 #### 文件管理不当 有时也会因为构建系统设置不正确而引发此类问题。比如使用CMake作为构建工具时,需确认所有的`.cpp`文件都被加入到了目标列表之中: ```cmake add_executable(${PROJECT_NAME} ${SOURCE_FILES} # 包含所有.cpp在内的源码路径 ) ``` 通过以上措施能够有效减少甚至消除“undefined reference to vtable”的出现几率。当然,具体情况还需结合实际开发环境来分析处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值