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
等方法. 每一个具体的表达式都将继承这个抽象表达式, 然后重写这些表达式中的方法, 来实现自己的特定功能, 这就是多态. 简单粗暴的理解就是, 表达式表现出多种不同的状态, 这是一种设计思想.