一、引言
在C++中,通过函数重载可以实现同一函数名不同的功能,即不同功能的函数使用同一名字。同样,在类中,也存在多态。不同的类之间存在继承,在基类中存在一个函数fun(),A类继承了基类,那么在A类中也存在func(),B类继承了基类,那么在B类中也存在func(),但是A类和B类中的函数名虽然与基类相同,但是实现却不一样,这就称为类的多态
二、实现
2.1 virtual:虚函数
在基类中,使用关键字virtual声明虚函数,告诉编译器不要将函数连接到基类中的函数
2.2 纯虚函数
如果只想在基类中声明函数,具体实现放在派生类中,这时可以使用纯虚函数
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
// pure virtual function
// = 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数
virtual int area() = 0;
};
- 代码实现:
#include<iostream>
using namespace std;
class Shape{
public:
float height;
float length;
// 若不加入virtual,使用指针调用函数时,将
// 调用基类中的函数
// void area(){
virtual void area(){
cout << "area of shape:"<<endl;
}
};
class Rec:public Shape{
public:
void area(){
cout << "area of rec:"<<endl;
}
};
class Tri:public Shape{
public:
void area(){
cout << "area of tri:"<<endl;
}
};
int main(){
// 直接定义Rec,Tri类,此时输出是各个类中的输出
Rec rec;
Tri tri;
rec.area();
tri.area();
cout << "**************"<<endl;
Shape *shape;
shape = &rec;
// 若不加入virtual,编译器将会把area()函数
// 链接到基类中的函数,加入virtual后,将只会
// 查看指针指向的内容,而不是看指针的类型
// 所指向的内容
shape->area();
shape = &tri;
shape->area();
}
- 运行结果:
area of rec:
area of tri:
**************
area of rec:
area of tri: