首页 > 编程语言 >C++多态的使用

C++多态的使用

时间:2024-07-16 21:55:27浏览次数:13  
标签:draw 函数 使用 多态 C++ 派生类 基类 shapePtr

多态(Polymorphism)是面向对象程序设计中一个重要的概念,它允许同样的操作在不同的对象上有不同的行为。在C++中,多态可以通过虚函数(Virtual Function)和继承来实现。

实现多态的基本步骤:

  1. 定义基类(Base Class)和派生类(Derived Class)
    • 基类定义通用的接口和虚函数。
    • 派生类继承基类,并可以重写(override)基类中的虚函数。
      // 基类
      class Shape {
      public:
          // 虚函数,用于多态
          virtual void draw() const {
              std::cout << "Drawing a shape" << std::endl;
          }
      };
      
      // 派生类1
      class Circle : public Shape {
      public:
          void draw() const override {
              std::cout << "Drawing a circle" << std::endl;
          }
      };
      
      // 派生类2
      class Square : public Shape {
      public:
          void draw() const override {
              std::cout << "Drawing a square" << std::endl;
          }
      };
      

      2.使用基类指针或引用

    • 基类的指针或引用可以指向派生类的对象,通过基类指针或引用调用虚函数,实现多态
      int main() {
          Shape* shapePtr;
          
          Circle circle;
          Square square;
          
          shapePtr = &circle;
          shapePtr->draw(); // 调用Circle类的draw()函数
          
          shapePtr = &square;
          shapePtr->draw(); // 调用Square类的draw()函数
          
          return 0;
      }
      

      Shape类是基类,其中的draw()函数是虚函数。CircleSquare类是Shape类的派生类,它们分别重写了draw()函数。在main()函数中,通过Shape类的指针shapePtr分别指向CircleSquare对象,并调用draw()函数。由于draw()函数是虚函数,并且根据实际对象类型进行动态绑定,因此会分别调用CircleSquare类中的draw()函数,实现了多态。

      注意事项:

    • 虚函数必须在基类中声明为virtual,并且可以在派生类中进行重写(override)。
    • 使用虚函数机制时,建议在基类析构函数中声明虚析构函数,以确保在删除指向派生类对象的基类指针时,会调用派生类的析构函数,避免内存泄漏和未定义行为。
    • 多态是面向对象程序设计的重要特性,通过合理使用虚函数和继承,可以提高代码的灵活性和可扩展性。

标签:draw,函数,使用,多态,C++,派生类,基类,shapePtr
From: https://blog.csdn.net/weixin_68115991/article/details/140477987

相关文章

  • 驱动 ioctl使用
     驱动程序部分创建一个简单的字符设备驱动程序。#include<linux/module.h>#include<linux/fs.h>#include<linux/uaccess.h>#include<linux/cdev.h>#include<linux/device.h>#defineDEVICE_NAME"mychardev"#defineCLASS_NAME"mycharclas......
  • 使用 GitHub 跟踪博文数据,并自动同步到 cnblogs
    导读开通了博客园的VIP发现了会员服务中的GitHub跟踪和同步博文数据的功能,测试发现习惯使用GitHub的话,这个还是一个挺不错的功能。本文主要分两部分,一是介绍说明如何使用该功能,并做相关个人的经验分享,二是作为个人GitHub同步cnblogs的文章的索引教程:如何使用适合人......
  • C++入门(3)inline函数与缺省参数
    一.inline函数当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。当函数功能简单,使用频率很高,为了提高效率,直接将函数的代码镶嵌到程序中。但这个方法有缺点,一是相同代码重复书写,二是程序的可读性往往没有......
  • C++基础入门(4)
    一.函数重载C语言实现int,double,char类型的比较大小函数。intmy_max_i(inta,intb){returna>b?a:b;}doublemy_max_d(doublea,doubleb){returna>b?a:b;}charmy_max_c(doublea,doubleb){returna>b?a:b;}这些函数都执行了相同的动作,返回两个形参中的最大值;从用户......
  • Django项目中使用markdown语法
    要让Django项目支持Markdown语言,你可以使用第三方库markdown来转换Markdown文本到HTML。以下是如何在Django项目中集成Markdown支持的步骤:1.安装Markdown库首先,安装Markdown库:pipinstallmarkdown2.在视图中使用Markdown在你的视图函数中,使用Markdown库将Markdown文本转......
  • 阿贝云永久免费云服务器1核1G5M服务器使用评测
    最近关注到了阿贝云,申请了一台,做个评测,供大家参考使用。永久免费服务器规格(CPU1核,内存1G,公网带宽5M,SSD数据盘10G),网络还是防御200G的高防BGP,还提供了两个快照服务,作为免费服务器来说还是非常不错的。使用 i-abc/Speedtest 三网测速大陆三网+教育网IPv4单线程测速-------......
  • 第八天笔记(项目测试工具悟道使用)
    禅道一、禅道的介绍(1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。(2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来(3)来源:禅道属易软天川公司(4)禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理,组织管理8众多功能,是中小企业管理......
  • 使用四元数解决欧拉角万向锁问题(二)
    使用四元数规避欧拉角万向锁问题(二)一、背景二、具体应用公式1.单位四元数对应旋转作用于向量2.轴角表示转四元数三、代码及实验1.python2.实验结果以及分析四、验证五、存在问题六、参考资料一、背景在使用四元数解决欧拉角万向锁问题(一)一文中已经实现了基于固......
  • Windows图形界面(GUI)-DLG-C/C++ - 列表框(ListBox)
    公开视频-> 链接点击跳转公开课程博客首页-> ​​​​​​链接点击跳转博客主页列表框(ListBox)控件类型单选列表框(Single-selectionListBox):用户一次只能选择一个列表项。它通常用于当选择范围被限定到一个单一的选项时。多选列表框(Multi-selectionListBox):用户可以同......
  • Windows图形界面(GUI)-DLG-C/C++ - 静态控件(Static)
    公开视频-> 链接点击跳转公开课程博客首页-> ​​​​​​链接点击跳转博客主页目录静态控件(Static)控件样式消息处理实例代码静态控件(Static)控件样式文本(Text):用来显示文本信息。可以是简单的一行文本或者复杂的格式化文本。图标(Icon):用来显示一个小图标,常用......