多态性是一种编程概念,它允许不同的对象类,通过继承关系,调用同一个函数元素时,以各自的方式来响应。这有助于创建一个通用机制,不仅描述基类的行为,还描述其后代类的行为。
基本概念
以形状类(CShape
)为例,我们定义了一个名为 GetArea()
的成员函数,旨在计算形状的面积。在所有从基类继承的后代类中,我们根据计算特定形状面积的规则重新定义此函数。
例如,对于正方形(类 CSquare
),其面积是通过其边长计算的;而对于圆形(类 CCircle
),其面积则是通过其半径表达的。
示例:多态性的应用
考虑以下场景,我们有一个数组存储 CShape
类型的对象,其中可以存储基类对象和所有后代类对象。接着,我们可以为数组中的每个元素调用相同的函数。
- 基类定义:
class CShape
{
protected:
int m_type; // 形状类型
public:
double GetArea(){return (0);} // 返回形状的面积
};
- 派生类的定义:
圆形类的定义如下:
class CCircle : public CShape
{
private:
double m_radius; // 圆半径
public:
void SetRadius(double r){m_radius=r;}
virtual double GetArea(){return (3.14*m_radius*m_radius);}
};
正方形类的定义与之类似:
class CSquare : public CShape
{
private:
double m_square_side;
public:
void SetSide(double s){m_square_side=s;}
virtual double GetArea(){return (m_square_side*m_square_side);}
};
- 数组的动态创建:
多态性允许我们创建一个基类 CShape
对象的数组。在声明此数组时,这些对象尚未知道,它们的类型未定义。程序执行过程中决定每个数组元素将包含的对象类型。这涉及到适当类的对象的动态创建,因此需要使用对象指针而不是对象。
例如,可以使用 new
运算符动态创建对象,并使用 delete
运算符单独和明确地删除每个这样的对象。
CShape *shapes[5];
CCircle *circle=new CCircle();
circle.SetRadius(2.5);
shapes[0]=circle;
- 对象操作:
对于已初始化和未初始化的对象,您可以通过遍历整个指针数组来检查它们。
为了确保不会意外删除不是动态分配的对象,我们必须在使用 delete
运算符删除一个对象时检查其指针的类型。
重点
多态性不仅包括在继承期间重新定义函数,还包括在一个类内部使用不同的参数集实现相同的函数。这意味着该类可能有几个名称相同但类型和/或参数集不同的函数。在这种情况下,多态性是通过函数重载来实现的。
总结
多态性是面向对象编程的核心概念之一,它增强了代码的复用性和可扩展性。通过理解和恰当地使用多态性,程序员可以写出更加模块化和易于维护的代码。