3

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

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

6 回答 6

12
virtual int add(int a, int b);

这不是纯虚函数的声明。它只是一个虚函数的声明。它缺少定义,这就是您收到错误的原因。

virtual int add(int a, int b) = 0;

这是一个纯虚函数的声明。它不需要定义,这就是为什么不会得到错误。

于 2013-01-17T13:55:32.953 回答
2

您收到链接器错误,因为c1::add(int,int)未实现。要么让它成为纯虚拟的,要么实现它。

于 2013-01-17T13:54:57.220 回答
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:


};
于 2013-01-17T13:55:57.543 回答
1

c1.add 不是纯虚拟的,您必须 add = 0

virtual int add(int a, int b) = 0; 
于 2013-01-17T13:54:54.920 回答
1

更改虚拟 int add(int a, int b); to virtual int add(int a, int b) = 0;

于 2013-01-17T13:55:37.290 回答
1

virtual int add(int a, int b); 这意味着“我的函数add可以被子类化”。在其他是“我的函数add可以被子类化并且是纯虚拟的”你需要

virtual int add(int a, int b) = 0;
于 2013-01-17T13:56:41.437 回答