一、多态
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
1、多态:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。
C++中,多态性表现形式之一,具有不同功能的函数可以用同一个函数名,即函数的重载
2、多态性,从系统实现上分为静态多态性和动态多态性
(1)静态多态性:在程序编译时系统就能决定调用的是哪个函数。如函数的重载和运算符的重载。
(2)动态多态性:在程序运行过程中才动态的确定操作所针对的函数对象。
二、虚函数
1、虚函数是在基类中使用关键字 virtual 声明的函数。
虚函数的动态,一个类函数的调用不是在编译时刻确定的,而是在运行时刻确定的,由于编写代码的时候不确定被调用的是基类函数,还是那个派生类的函数,所以称为虚函数。
2、作用:解决动态多态问题,核心理念是通过基类访问派生类定义的函数。
3、使用虚函数的情况:
- 成员函数所在的类作为基类,并且该成员函数在派生类中需要更改功能。
- 如果要使用基类指针或引用调用成员函数,还不是通过对象调用函数时,需要将该成员函数声明为虚函数。
4、虚函数的应用举例
使用虚函数的一种情况为:某成员函数需要在派生类中重新定义其功能。
#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() //基类定义虚函数
{
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 (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area () //派生类中重新定义虚函数
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// 程序的主函数
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存储矩形的地址
shape = &rec;//通过基类访问派生类的成员函数
// 调用矩形的求面积函数 area
shape->area();
// 存储三角形的地址
shape = &tri;//通过基类访问派生类的成员函数
// 调用三角形的求面积函数 area
shape->area();
return 0;
}
生成结果:
Rectangle class area Triangle class area
三、纯虚函数
1、纯虚函数是虚函数的一个子集,即基类中定义但不实现的虚函数。
2、虚函数的作用:是派生类仅仅只是继承函数的接口。
3、纯虚函数的特征:必须在继承类中重新声明函数,而在抽象类中不作定义。
4、抽象类:带有纯虚函数的类。
抽象类的特点:
- 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。
- 抽象类不能定义对象,即抽象类不能生成对象。抽象类如同动物,可以派生猫狗等子类,但动物本身不能生成对象。
- 纯虚函数在基类中没有定义。
5、虚函数的格式
virtual 函数类型 函数名(参数表列)=0;
6、纯虚函数的应用举例
使用场景:基类中虚函数不需要给出实际定义
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
// pure virtual function
virtual int area() = 0; //定义纯虚函数
};