虚函数和纯虚函数
多态是C++的三大特性之一,多态分为两类:
静态多态:静态多态的函数地址早绑定,编译阶段确定函数地址,静态连编 (函数重载 运算符重载 复用函数名属于静态多态)
动态多态:动态多态的函数地址晚绑定,运行阶段确定函数地址,动态连编 (派生类和虚函数运行时多态)
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
虚函数:
virtual 返回值类型 函数名(){};
#include <iostream>
using namespace std;
class Parents{
public:
virtual void speak(){ //虚函数
cout << "Parents speak" << endl;
}
};
class Child1:public Parents{
public:
void speak(){
cout << "Child1 speak" << endl;
}
};
class Child2: public Parents{
public:
void speak(){
cout << "Child2 speak" << endl;
}
};
int main(){
Parents *p;
Child1 c1;
p =&c1;
p->speak();
Child2 c2;
p =&c2;
p->speak();
}
Child1 speak
Child2 speak
如果基类中的函数不加virtual ,运行结果如下
Parents speak
Parents speak
纯虚函数
基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
virtual 返回值类型 函数名()=0;
#include <iostream> using namespace std; class Parents{ public: virtual void speak()=0; //纯虚函数 }; class Child1:public Parents{ public: void speak(){ cout << "Child1 speak" << endl; } }; class Child2: public Parents{ public: void speak(){ cout << "Child2 speak" << endl; } }; int main(){ Parents *p; Child1 c1; p =&c1; p->speak(); Child2 c2; p =&c2; p->speak(); }
Child1 speak
Child2 speak
注意:
类中有一个纯虚函数就成为抽象类
抽象类不能被实例化
子类必须实现父类中的纯虚函数,否则子类也属于抽象类