每当我使用纯虚函数时,“错误:未解析的外部符号”

时间:2013-01-17 13:53:46

标签: c++ class inheritance virtual-functions

我觉得我做的事情非常愚蠢,但我根本无法弄清楚我的代码有什么问题。我甚至制作了代码的超级简化版本,但错误仍然存​​在:

#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)

6 个答案:

答案 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;