【问题标题】:C++ unresolved external symbolC++ 未解析的外部符号
【发布时间】:2025-12-27 11:15:11
【问题描述】:

我有一个类设置,并且我正在使用该类的继承。

在文件 a.h 中

class a
{
public:
    virtual void print();
};

在文件 b.h 中:

#include "a.h"
#include <iostream>
class b: public a
{
public:
    void print();
};

在 b.cpp 中

#include "a.h"
#include "b.h"
void b::print(){};

在主文件中我包含了这两个文件:

#include "a.h"
#include "b.h"

但我得到一个未解析的虚函数打印符号。文件 a.obj 被列为生成错误的文件我在做什么错?如果我将 b.cpp 移动到类定义下方的 b.h 中,它可以正常工作。

【问题讨论】:

    标签: c++


    【解决方案1】:

    你有一个 b::print 的实现,但没有一个 a::print 的实现。如果实例化 a 类的对象并在其上调用 print() 会发生什么?即

    a o;
    o.print();
    

    b::print 覆盖 a::print 但您仍然需要实现 a::print(除非您将其设为纯虚拟)。

    要在 a 中使 print 成为纯虚拟,可以这样定义:

    virtual void print() = 0;
    

    当一个类具有纯虚函数时,您不能实例化该类的对象。您必须从该类派生并提供任何纯虚函数的实现,然后才能拥有可以实际实例化的类。

    【讨论】:

    • 我猜这就是它,即使 OP 并没有真正提供足够的信息来确定。
    • 啊,我明白了。我必须将 = 0 添加到虚拟声明的末尾。 en.wikipedia.org/wiki/Virtual_function#C.2B.2B_2 供未来的观众使用。谢谢。
    • 纯虚拟意味着它没有实现,由您的class a中的virtual void print() = 0;表示。
    • ... 并且大多数都在继承具体类中实现以匹配特定的设计模式,例如工厂方法
    • @Mark - 通常,但并非总是如此。在 C++ 中,它们也可以有实现。派生类仍然需要提供覆盖。
    【解决方案2】:

    这可能是一个错字,但在b.cpp 中,您在一个名为Add 的类中实现了print() 函数,而不是b 类。

    【讨论】:

    • 感谢您的注意,这是一个错字。 (输入 SO 的错字,真正的问题还是一样)
    【解决方案3】:

    我认为你需要在类接口的末尾加一个分号

    【讨论】: