C++ 未解决的外部符号

5

我有一个类设置,从这个类中我正在使用继承。

在文件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"

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

3个回答

9
你已经实现了b::print,但没有实现a::print,如果实例化a类并调用它的print()方法会发生什么?即:
a o;
o.print();
b::print 重载了 a::print,但你仍然需要有 a::print 的实现(除非你将其定义为纯虚函数)。
要使 a::print 成为纯虚函数,请按照以下方式定义:
virtual void print() = 0;

当一个类拥有纯虚函数时,你无法实例化该类的对象。你必须从该类派生,并在提供任何纯虚函数的实现之前,才能得到一个可以实际实例化的类。


我猜这就是答案,尽管原帖没有提供足够的信息来确定。 - Edward Strange
啊,我明白了。我必须在虚函数声明的末尾添加“=0”。对于未来的观众,请查看http://en.wikipedia.org/wiki/Virtual_function#C.2B.2B_2。谢谢。 - Joshua Enfield
2
纯虚函数意味着它没有实现,在您的a类中用virtual void print() = 0;表示。 - Mark Tolonen
...并且必须在继承具体类以匹配特定设计模式(如工厂方法)时实现。 - Y.H.
@Mark - 通常是这样,但并不总是。在C++中它们也可以有实现。派生类仍然需要提供覆盖。 - Edward Strange

1

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


谢谢您注意到了,那是一个打字错误。(在SO中输入错误,真正的问题仍然相同) - Joshua Enfield

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接