C++多态
继承和派生
当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态
如:shape类被派生为两个类:Rectangle和Triangle
#include<iostream>
using namespace std;
class Shape{
protected:
int width,height;
public:
Shape(int a=0,int b=0){width=a;height=b;}
int area(){
cout<<"parent class area";
return 0;
}
};
class Rectangle:public Shape{
public:
Rectangle(int a=0,int b=0):Shape(a,b){}
int area(){
return width*height;
}
};
class Triangle:public Shape{
public:
Triangle(int a=0,int b=0):Shape(a,b){}
int area(){
return width*height/2;
}
};
int main(){
Rectangle rec(10,7);
Triangle tri(10,5);
cout<<tri.area()<<endl;
cout<<rec.area()<<endl;
}
虚函数
虚函数是在基类中用关键字virtual
声明的函数,在派生类中重新定义基类中定义过的虚函数时,会告诉编译器不要静态链接到该函数
如:上面的例子
int main(){
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
shape=&rec;
cout<<shape->area()<<endl;
shape=&tri;
cout<<shape->area()<<endl;
}
输出
并不是想象中的两个面积,这是因为调用shape->area()是基类中的area()函数,这就是静态多态
、静态链接
,函数调用在程序执行前就准备好了,也被称为早绑定
,要解决这个问题,可以使用virtual
修饰基类中的area()函数。
class Shape{
protected:
int width,height;
public:
Shape(int a=0,int b=0){width=a;height=b;}
virtual int area(){
cout<<"parent class area";
return 0;
}
};
输出
这样程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接
纯虚函数
如果定义虚函数=0,如virtual int area()=0;
,
那么这个函数就是一个纯虚函数,纯虚函数所在的类,只能被继承,不能用于实例化,类似java中的抽象类
如:
#include<iostream>
using namespace std;
class Shape{
protected:
int width,height;
public:
Shape(int a=0,int b=0){width=a;height=b;}
virtual int area()=0;
};
class Rectangle:public Shape{
public:
Rectangle(int a=0,int b=0):Shape(a,b){}
int area(){
return width*height;
}
};
int main(){
Rectangle rec(10,2);
cout<<rec.area();
}