我觉得我做的事情非常愚蠢,但我根本无法弄清楚我的代码有什么问题。我甚至制作了代码的超级简化版本,但错误仍然存在:
#include <iostream>
using namespace std;
class c1{
public:
c1(){}
~c1(){}
virtual int add(int a, int b);
private:
protected:
};
class c2 : c1{
public:
c2(){}
~c2(){}
int add(int a, int b){
return a+b;
}
};
int main(){
c2 c;
c.add(5,6);
}
有人能发现我确信有史以来最愚蠢的错误吗?
以下是确切的错误消息:
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall c1::add(int,int)" (?add@c1@@UAEHHH@Z)
答案 0 :(得分:12)
virtual int add(int a, int b);
这不是纯虚函数的声明。它只是一个虚函数的声明。它没有定义,这就是你得到错误的原因。
virtual int add(int a, int b) = 0;
这是纯虚函数的声明。它不需要定义,这就是为什么不会出错。
答案 1 :(得分:2)
您收到链接器错误,因为c1::add(int,int)
未实现。
要么是纯虚拟的,要么实现它。
答案 2 :(得分:2)
c1::add()
不是纯粹的虚拟,它只是没有实现。这意味着链接器正确查找正文,并在无法找到正确时进行投诉。你可能意味着这个:
class c1{
public:
c1(){}
~c1(){}
virtual int add(int a, int b) = 0; // adding = 0 makes the function pure virtual
private:
protected:
};
答案 3 :(得分:1)
c1.add不是纯虚拟的,您必须添加 = 0 。
virtual int add(int a, int b) = 0;
答案 4 :(得分:1)
更改virtual int add(int a,int b); 至 virtual int add(int a,int b)= 0;
答案 5 :(得分:1)
virtual int add(int a, int b);
这意味着“我的函数add
可以被子类化”。在另一个是“我的函数add
可以是子类,并且是纯虚拟的”你需要
virtual int add(int a, int b) = 0;