上一篇文章讲解了类、继承,重载。这一篇文章来讲讲C++的多态、虚函数、纯虚函数。
C++多态
多态:C++中的多态分为静态多态,动态多态。
静态多态:调用函数被编译器设置为基类中的版本,函数调用在程序执行前就决定了好了,这就是所谓的静态多态,或静态链接。
动态多态:派生类对象的地址可以赋值给基类指针。对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用
静态多态实例:
#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 :" << 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;
shape->area();
shape = &tri;
shape->area();
return 0;
}
以上代码输出结果为:
Parent class area :
Parent class area :
你会发现静态多态没有调用各个子类的的area方法,导致错误输出都是基类的方法内容。
动态多态:
静态多态变成动态多态,需要稍微修改一下代码,通过虚函数的方法来实现动态链接。在函数前添加virtual。虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。
下面的基类的area方法在静态多态的基础上加了virtual:
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;
}
};
纯虚函数:
您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。纯虚函数就是虚函数的函数主体=0,也就是没有主体。
下面的area就是纯虚函数:
class Shape {
protected:
int width, height;
public:
Shape(int a = 0, int b = 0)
{
width = a;
height = b;
}
virtual int area() = 0;
}
注意:
①虚函数和纯虚函数在多态中,存在差异,虚函数在派生类中可以选择是否重写该虚函数,如果派生类重写了虚函数,则调用子类的函数,否则调用基类的函数。而纯虚函数必须在派生类中实现该纯虚函数。
②当类中存在纯虚函数,则该类为抽象类。
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!