一、多态的概念及应用
多态是C++的一个重要特性,指同一函数或方法,可以在不同的对象上产生不同的行为。多态分为静态多态和动态多态。静态多态是指函数重载,动态多态是指虚函数和运行时多态。
动态多态性是多态的高级形态,是通过虚函数实现的。它的实现方式是将一个函数声明为虚函数,在基类中定义,子类中根据需要重新定义。在程序运行时根据对象的实际类型来调用相应的函数,实现多态。动态多态性的优点是实现了代码的可复用性。因为基类中声明的虚函数在子类中仍然有效,可以在子类中重新定义,从而满足不同对象的需求。
下面是一个简单的动态多态的例子,定义一基类Shape,其中定义了一个虚函数CalculateArea()。圆类Circle和矩形类Rectangle都继承Shape类,它们都需要重新定义CalculateArea()函数的实现:
class Shape { public: virtual double CalculateArea() = 0; }; class Circle: public Shape { public: Circle(double radius) : m_radius(radius) {} virtual double CalculateArea() { return 3.14159*m_radius*m_radius; } private: double m_radius; }; class Rectangle: public Shape { public: Rectangle(double width, double height) : m_width(width), m_height(height) {} virtual double CalculateArea() { return m_width*m_height; } private: double m_width; double m_height; };
在上述代码中,Shape是基类,定义了一个纯虚函数CalculateArea(),这意味着在Shape类中这个函数没有实现,而且我们必须在派生类中实现它。Circle和Rectangle都代表了形状,派生自Shape类,它们都实现了基类的CalculateArea()函数,但是每个类都有自己的实现方法。我们可以通过在函数签名前面加上virtual关键字,告诉编译器这个函数是虚函数,需要在运行时重写实现。
二、继承的概念及应用
继承是C++提供的另一种重要特性,允许一个类派生出另一个类,并使用已有类的所有属性和方法,实现代码的复用。在C++中,一个类可以派生出多个子类,子类可以是直接或间接派生出来的。继承分为单一继承、多重继承和虚继承。
下面是一个简单的继承的例子,定义一个Animal类作为基类,Dog类和Cat类都派生自Animal类:
class Animal { public: void Eat() { cout << "Animal eats !" << endl; } }; class Dog: public Animal { public: void Bark() { cout << "Dog barks !" << endl; } }; class Cat: public Animal { public: void Meow() { cout << "Cat meows !" << endl; } };
在上述代码中,Animal是一个基类,定义了一个Eat()函数,表示动物吃。另外,Dog和Cat是派生类,它们都从Animal类继承Eat()函数,同时又有自己的特定函数Dog::Bark()和Cat::Meow(),表示狗叫和猫叫。
三、多态和继承的应用
多态和继承结合使用可以更好地实现C++代码的复用。例如,我们可以用多态和继承实现一个图形计算器,用户可以输入不同的形状及相应的参数,程序可以通过多态完成其面积的计算,并输出计算结果。
下面是一个简单的面向对象的图形计算器实现,可以计算圆形和矩形的面积:
class Shape { public: virtual double CalculateArea() = 0; }; class Circle: public Shape { public: Circle(double radius) : m_radius(radius) {} virtual double CalculateArea() { return 3.14159*m_radius*m_radius; } private: double m_radius; }; class Rectangle: public Shape { public: Rectangle(double width, double height) : m_width(width), m_height(height) {} virtual double CalculateArea() { return m_width*m_height; } private: double m_width; double m_height; }; class Calculator { public: double CalculateArea(Shape& shape) { return shape.CalculateArea(); } }; int main() { Circle circle(3); Rectangle rectangle(4,5); Calculator calculator; cout << "The area of Circle is: " << calculator.CalculateArea(circle) << endl; cout << "The area of Rectangle is: " << calculator.CalculateArea(rectangle) << endl; return 0; }
在上述代码中,Shape是基类,定义了一个纯虚的CalculateArea()函数。Circle和Rectangle是派生自Shape类的子类,它们都重写了基类的虚函数,并实现了各自特定的计算方法。Calculator是计算器类,它有一个CalculateArea函数,使用Shape&参数,我们可以把Circle和Rectangle对象作为参数传递给这个函数,程序就会自动调用它们的CalculateArea()函数,进行相应的面积计算。