C++ &引用;错误:未解析的外部符号“;每当我使用纯虚函数时

C++ &引用;错误:未解析的外部符号“;每当我使用纯虚函数时,c++,class,inheritance,virtual-functions,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(){}

我觉得我在做一些非常愚蠢的事情,但我就是不知道我的代码出了什么问题。我甚至制作了一个超级简化版本的代码,错误仍然存在:

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

}

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

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

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

virtual int add(int a, int b);
这不是纯虚函数的声明。它只是一个虚函数的声明。它缺少定义,这就是为什么会出现错误

virtual int add(int a, int b) = 0;
这是一个纯虚函数的声明。它不需要定义,因此不会得到错误。

更改虚拟int add(int a,int b);
virtual int add(int a, int b) = 0;
到 虚拟整数相加(整数a,整数b)=0

c1::add()
不是纯虚拟的,只是没有实现。这意味着链接器可以正确地查找主体,并且可以在找不到主体时进行投诉。你可能是这个意思:

class c1{
public:
    c1(){}
    ~c1(){}

    virtual int add(int a, int b) = 0;  // adding = 0 makes the function pure virtual

private:
protected:


};
virtualintadd(inta,intb)
这意味着“我的函数
add
可以子类化”。在另一种情况下,“我的函数
add
可以子类化,并且是纯虚拟的”,您需要


他没有理由必须使用公共继承,除非他想向下转换指向
c2
c1*
的指针,而在他的示例中他没有这样做。他仍然可以从main调用
c2::add
,因为这是一个公共函数。非常欢迎您。我很高兴看到你这么快就修好了
virtual int add(int a, int b) = 0;