- 多种形态,当类之间存在层次结构,通过继承关联起来的时候,我们就需要用到多态。需要根据函数对象的类型来调用不同的函数。例如猴子和兔子都是属于动物类,但是叫声不同,根据叫声不同我们需要执行的是猴子的叫声和兔子的叫声而不是单纯的动物叫声,这时候就要根据对象的不同来实现不同的叫声。执行各自的函数。
- 调用函数重名时,会默认调用基类的实现函数,静态多态,函数在程序执行前就准备好了,俗称提前绑定。在程序编译之前就已经绑定好了。
- 虚函数 virtual声明的函数,在派生类中重新定义基类定义的虚函数时。会告诉编译器不要静态链接到该函数,根据所调用类型来调用函数,称为动态链接,或者后期绑定。
#include <iostream>
using namespace std;
class Shape{
protected:
int width;
int height;
public:
Shape(int a=0,int b=0)
{
this->width = a;
this->height = b;
}
virtual int area(){
cout<<"Parent class area:"<<endl;
return 0;
}
};
class Rectangle:public Shape{
public:
Rectangle(int a=0,int b=0): Shape(a,b){}
int area(){
cout<<"Rectangle class area"<<endl;
return (this->width*this->height);
}
};
class Triangle:public Shape{
public:
Triangle(int a=0,int b=0): Shape(a,b){}
int area(){
cout<<"Triangle class area"<<endl;
return (this->width*this->height/2.);
}
};
int main(){
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
shape = &rec;
shape->area();
shape = &tri;
shape->area();
return 0;
return 0;
}
- 纯虚函数
- 有点类似与抽象类,接口。为了派生类中重新定义该函数。在基类中不对虚函数给出有意义的实现,这个时候使用纯虚函数。基类定义方法,派生类具体实现。
#include <iostream>
using namespace std;
class Shape{
protected:
int width;
int height;
public:
Shape(int a=0,int b=0)
{
this->width = a;
this->height = b;
}
virtual int area() = 0;
// {
// cout<<"Parent class area:"<<endl;
// return 0;
// }
};
class Rectangle:public Shape{
public:
Rectangle(int a=0,int b=0): Shape(a,b){}
int area(){
cout<<"Rectangle class area"<<endl;
return (this->width*this->height);
}
};
class Triangle:public Shape{
public:
Triangle(int a=0,int b=0): Shape(a,b){}
int area(){
cout<<"Triangle class area"<<endl;
return (this->width*this->height/2.);
}
};
int main(){
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
shape = &rec;
shape->area();
shape = &tri;
shape->area();
return 0;
return 0;
}