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;