目录
1.多态是什么
1.1多态的定义
-
字面意思理解
从字面意思理解即“多种形态”,在C++中,多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
-
从技术层面理解
从技术层面来讲,C++中的多态主要是通过纯虚函数来实现。当一个函数被声明为虚函数时,它在派生类中可以被重新定义(重写)。通过基类的指针与或引用调用虚函数时,实际调用的是指向对象所属类的重写版本,这也是所谓的动态绑定,也是实现运行时多态的关键机制。
例如:定义一个基类Animal,其中包含一个虚函数makeSound,然后派生出Dog和Cat类,分别重写makeSound函数以实现不同的声音。当使用Animal类型的指针或引用指向Dog或Cat对象,并调用makeSound函数时,会根据实际指向的对象类型调用相应的声音实现
1.2多态的作用
多态的作用主要体现在提高代码的灵活性,可维护性和可扩展性。通过多态,我们可以编写通用的代码,而无需为每个具体的对象类型编写特定的处理逻辑。这使得代码更加简洁、易于理解和维护。
1.3多态的分类
1. 3.1静态多态
- 函数重载(Function Overloading)
定义:在同一个类中,可以定义多个同名的函数,但是这些函数的参数列表(参数的个数、类型、顺序)不同。编译器会根据调用函数时传递的实际参数来确定要调用的具体函数版本。
例如,在一个计算图形面积的类中,可以有两个名为
area
的函数。一个用于计算圆形的面积,参数是半径(double radius
),计算公式是3.14 * radius * radius
;另一个用于计算矩形的面积,参数是长和宽(double length, double width
),计算公式是length * width
。当在代码中调用area
函数时,编译器会根据传入的参数类型和数量来决定是调用计算圆形面积的函数还是计算矩形面积的函数。
- 运算符重载(Operator Overloading)
定义:允许用户重新定义 C++ 中的大多数运算符,使它们能够按照用户自定义的方式来操作对象。通过运算符重载,可以让自定义类型(如类)像基本数据类型一样使用运算符进行运算。
例如,对于一个复数类
Complex
,可以重载+
运算符来实现两个复数相加。假设复数类有两个成员变量real
(实部)和imag
(虚部),重载+
运算符的函数可以这样定义:Complex operator+(const Complex& other) { return Complex(real + other.real, imag + other.imag); }
。这样,当有两个复数对象c1
和c2
时,可以像c3 = c1 + c2
这样直接使用+
运算符来计算它们的和。
1.3.2动态多态
- 虚函数(Virtual Functions)
定义:在基类中声明一个虚函数,在派生类中可以重新定义这个虚函数。当通过基类指针或引用调用这个函数时,程序会根据指针或引用所指向的实际对象类型来决定调用基类的函数版本还是派生类的函数版本。
<例如,有一个基类
Shape
,其中有一个虚函数draw
。然后有两个派生类Circle
和Rectangle
,它们都重写了draw
函数来实现各自形状的绘制逻辑。如果有一个Shape*
类型的指针,它可以指向Circle
对象或者Rectangle
对象。当通过这个指针调用draw
函数时(如shapePtr->draw()
),程序会根据shapePtr
实际指向的是Circle
还是Rectangle
来调用对应的draw
函数版本。