您的位置:

利用多态和继承设计可复用的C++代码

一、多态的概念及应用

多态是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()函数,进行相应的面积计算。