前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 多态、虚函数、纯虚函数《Rice C++ 学习开发》

C++ 多态、虚函数、纯虚函数《Rice C++ 学习开发》

作者头像
Rice加饭
发布2022-05-09 21:30:42
3040
发布2022-05-09 21:30:42
举报
文章被收录于专栏:Rice嵌入式Rice嵌入式

上一篇文章讲解了类、继承,重载。这一篇文章来讲讲C++的多态、虚函数、纯虚函数。

C++多态

多态:C++中的多态分为静态多态,动态多态。

静态多态:调用函数被编译器设置为基类中的版本,函数调用在程序执行前就决定了好了,这就是所谓的静态多态,或静态链接。

动态多态:派生类对象的地址可以赋值给基类指针。对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用

静态多态实例:

代码语言:javascript
复制
#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;
}

以上代码输出结果为:

代码语言:javascript
复制
Parent class area :
Parent class area :

你会发现静态多态没有调用各个子类的的area方法,导致错误输出都是基类的方法内容。

动态多态:

静态多态变成动态多态,需要稍微修改一下代码,通过虚函数的方法来实现动态链接。在函数前添加virtual。虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。

下面的基类的area方法在静态多态的基础上加了virtual:

代码语言:javascript
复制
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就是纯虚函数:

代码语言:javascript
复制
class Shape {
protected:
  int width, height;
public:
  Shape(int a = 0, int b = 0)
  {
    width = a;
    height = b;
  }
  virtual int area() = 0;
}

注意:

虚函数和纯虚函数在多态中,存在差异,虚函数在派生类中可以选择是否重写该虚函数,如果派生类重写了虚函数,则调用子类的函数,否则调用基类的函数。而纯虚函数必须在派生类中实现该纯虚函数。

当类中存在纯虚函数,则该类为抽象类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档