首页 > 其他分享 >CPP虚函数详解与实例

CPP虚函数详解与实例

时间:2024-12-21 11:42:28浏览次数:4  
标签:15445 函数 实例 多态 详解 CPP CMU 表达式

CPP虚函数详解与实例

在 CMU_15445 的Project3 中大量使用了虚函数,抽象类的方法 主要在 Expression(表达式) 以及 Executor(Plan_Node的执行) 中, 在完成 Part1 的时候仅关注了功能的实现, 还没有完全搞清楚为什么要使用虚函数以及抽象类, 以及虚函数背后的原理, 本次补充一下.

虚函数的定义

大多人看到虚函数的第一眼往往是,

程序运行时可以通过父类的指针或引用调用子类的函数.

但是, 这只是虚函数的工作方式, 也不是虚函数的目的, 也不是工作原理, 所以看到这句话大部分人还是一头雾水, 也没有继续看下去的意愿.
所以我们从头开始讲, 并且我将会引入最近在做的 CMU_15445 中的表达式的例子, 用于更详细的解释.

虚函数的目的

我们知道 OOP 的三大特性是, 封装, 继承与多态, 其中虚函数是实现多态的方式, 虚函数的目的也就是实现多态.

多态 (polymorphism)

我引用一段英文描述, 我觉得很好的解释了什么是多态:

Polymorphism is a popular concept in object-oriented programming (OOP), referring to the idea that an entity in code such as a variable, function or object can have more than one form. The word polymorphism is derived from Greek and means "having multiple forms." Apart from computer programming, the idea of polymorphism occurs in other real-world areas, including biology, chemistry and drug development.

多态的概念就不再赘述了, 在 CMU_15445 的 Project3 中, 我们用表达式来解释多态就是, BUSTUB 中支持 SQL 语法的多种表达式, 我们将这些表达式的属性以及功能进行抽象, 得到一个基类, 也就是 abstract_expression, 并且抽象出一些方法为 Evaluate, EvaluateJoin 等方法. 每一个具体的表达式都将继承这个抽象表达式, 然后重写这些表达式中的方法, 来实现自己的特定功能, 这就是多态. 简单粗暴的理解就是, 表达式表现出多种不同的状态, 这是一种设计思想.

用虚函数来实现多态

标签:15445,函数,实例,多态,详解,CPP,CMU,表达式
From: https://www.cnblogs.com/wevolf/p/18620584

相关文章

  • Vue.js实例开发-如何通过Props传递数据
    props是父组件用来传递数据给子组件的一种机制。通过props,你可以将数据从父组件“传递”到子组件,并在子组件的模板和逻辑中使用这些数据。1.定义子组件并接收props首先,定义一个子组件,并在该组件中声明它期望接收的props。这可以通过在组件的script部分使用props选项......
  • 【C++】智能指针详解
    ......
  • Python中所有子图标签Legend显示详解
    在数据可视化中,图例(legend)是一个非常重要的元素,它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时,matplotlib库是一个非常强大的工具,能够轻松创建包含多个子图的图表,并在每个子图中显示图例。本文将详细介绍如何在Python的matplotlib库中为所有子图显示标......
  • 数据结构漫游记:静态链表的实现(CPP)
    嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let'sgo!我的博客:yuanManGan我的专栏:C++入门小馆 C......
  • Java实现单词的翻译(详解爬虫操作)
    JAVA通过Crawler实现英语单词的翻译首先声明一点,这种方法仅限于低频次的交互来获取翻译信息,一旦一秒内大量的请求会被重定向,那就直接不能用了如果希望可以批量查询英语单词翻译,可以查看我的下一篇博客。接着我们上一讲Java如何用HaspMap统计次数并排序详解-ivanlee717-博......
  • Python网络爬虫技术详解与实战案例
    Python网络爬虫技术详解与实战案例引言网络爬虫(WebCrawler)是一种自动化程序,用于在互联网上收集数据。通过向网页发送HTTP请求,获取网页数据,然后提取和分析网页内容,网络爬虫能够实现数据收集、信息提取和数据分析等多种应用场景。Python作为一种功能强大且易于学习的编程语......
  • C#调用c语言dll,并且传入byte数组或字符串,简单实例
    前言在C#中调用dll,可能会出现程序一开始可以运行,但过一会儿后出现内存错误——尝试读取或写入受保护的内存。这通常指示其他内存已损坏。这是由于C#的托管内存机制,而C语言中是非托管内存。如果参数传入dll后,C#提前回收了内存或者移动了数据,将会出现错误。解决方法是,在C#传入dll......
  • cpp智能指针
      普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型uniqu......
  • 基础 (map,pair的使用详解)/题目 两数之和 讲解 哈希表的使用
    力扣题目链接(opensnewwindow)https://leetcode.cn/problems/two-sum/给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给......
  • Web安全攻防入门教程——hvv行动详解
    Web安全攻防入门教程Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。本教程将带你入门Web安全攻防的基础概念、常见攻击类......