多态是指父类的函数在子类进行从定义再使用的方式。所以多态是在继承的基础上才能实现的。
要实现多态首先我们得先了解virtual这个关键词。
1.虚函数
在类中拥有virtual这个关键词的函数我们称为虚函数。
虚函数就是可以被子类重写或者使用的。
如果父类定义了个虚函数那么其子类重定义的同名函数也会是虚函数。
2.多态的语法
#include<iostream>
using namespace std;
class father {
public:
virtual void fun(){
cout<<"i am father"<<endl;
}
};
class son:public father {
public:
void fun(){
cout<<"i am son"<<endl;
}
};
class mother:public father{
void fun(){
cout<<"i am mother"<<endl;
}
};
void dos(father &a){//c++中父类作为函数的输入时可实际输入确是父类的子类依旧可以正常运行
a.fun();
}
int main() {
son a;
dos(a);
return 0;
}
/*上面是通过全局函数来子类的函数调用下面介绍另外一种用指针的办法
father *abc=new son;
abc->fun();
*/
多态就是为了让同一个函数在不同的子类中可以起到不同的作用。
让开发人员在开发过程中可以有更清楚的构架,对后续的修改和拓展也十分的方便。
3.纯虚函数
在多态实现的过程中我们的父类中的虚函数很经常都是空的,这时候就可以用纯虚函数来使用。
virtual 返回类型 函数名 = 0;(这句是纯虚函数的语法结构)
不过纯虚函数有一个点要注意,子类必须要重写纯虚函数,否则无法创造对象(一个类中存在纯虚函数就无法创造对象)
4.虚构造函数
#include<iostream>
using namespace std;
class father {
public:
father() {
cout<<"父亲的构造函数"<<endl;
}
virtual ~father() {
cout<<"父亲的析构函数"<<endl;
}
virtual void fun() =0;
};
class son:public father {
public:
son() {
cout<<"儿子的构造函数"<<endl;
}
~son() {
cout<<"儿子析构函数"<<endl;
}
void fun() {
cout<<"i am son"<<endl;
}
};
int main() {
father *abc=new son;
abc->fun();
delete abc;
}
虚析构函数主要解决的是内存泄漏的问题,用指针的办法引用子类需要在堆区申请一个空间。
在使用完毕后进行释放。但是virtual ~father()这个代码如果讲virtual去掉,则运行完后无法出现儿子的析构函数。原因就是abc是父亲这个类的指针,所以只调用了自身的虚构函数。