虚函数与纯虚函数其实是两个概念,而平常我自己接触到的虚函数往往是纯虚函数,开始觉得这个概念无关紧要,后来发现还是需要认真区分为好:
首先虚函数是指在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。
用法:virtual 函数返回类型 函数名(参数表) {函数体};
两者的区别:
一·函数申明:
虚函数,在函数的声明(不是定义)语句前加“virtual”, 如 virtual void functions()
virtual void setID(int ID){
this->ID=ID;//函数实现
}
纯虚函数,在虚函数后还需要加上“=0”,如 virtual void functions()=0
virtual int getID(void)=0;
二·子类继承:
虚函数,派生类类可自主选择是否要提供一份属于自己的个性化虚函数实现。意思是派生类可以选择不重写基类中的虚函数方法,这样可以避免一定程度上的麻烦。
#include<iostream>
using namespace std;
class People{
public:
virtual void setID(int ID){
this->ID=ID;
}
int ID;
};
class Student:public People{
public:
};
int main(){
Student s;
s.setID(1);//运行成功
return 0;
}
纯虚函数,派生类必须提供一份属于自己的个性化纯虚函数实现。因此纯虚函数就会用在接口中,因为接口中的方法规定继承的派生类对其中所有的方法都要申明和实现。
#include<iostream>
using namespace std;
class People{
public:
virtual void getID(void)=0;
};
class Student:public People{
public:
void getID();
};
void Student::getID(void){
cout<<"ID comfirmed";
}
int main(){
Student s;
s.getID();
return 0;
}
三·实例化:
虚函数,申明虚函数的类可以实例化对象。
#include<iostream>
using namespace std;
class People{
public:
virtual void setID(int ID){
this->ID=ID;
}
int ID;
};
int main(){
People s;
return 0;
}
纯虚函数,申明纯虚函数的类不能实例化对象,必须在派生类中实现后,才能由派生类实例化。
#include<iostream>
using namespace std;
class People{
public:
virtual int getID(void)=0;
int ID;
};
int main(){
People s;//程序报错,People为抽象类无法实例化对象
return 0;
}
#include<iostream>
using namespace std;
class People{
public:
virtual int getID(void)=0;
int ID;
};
class Student:public People{
public:
int getID(void);
};
int Student::getID(void){
return ID;
}
int main(){
Student s;
s.getID();//运行成功
return 0;
}
使用虚函数,纯虚函数时可能的报错:
undefined reference to `Student::setID(int)'
当基类申明了一个虚函数而派生类需要使用时,派生类不需要在自己中再申明一次,直接调用基类虚函数就可以,不然就会出现这个错误。如果在派生类中再次申明,则需要对这个虚函数进行重写(override)
#include<iostream>
using namespace std;
class People{
public:
virtual void setID(int ID){
this->ID=ID;
}
virtual int getID(void)=0;
int ID;
};
class Student:public People{
public:
int getID(void);
void setID(int ID);//此处注释掉即可
};
int Student::getID(void){
return ID;
}
int main(){
Student s;
s.setID(1);
cout<<s.getID();
return 0;
}
来源:CSDN
作者:moguwai
链接:https://blog.csdn.net/wybnmsl/article/details/104187272