当前位置:首页 C++ > 正文

c++静态多态与动态多态

作者:野牛程序员:2023-12-31 09:08:22 C++阅读 2863

C++中的静态多态性和动态多态性是面向对象编程中的两个重要概念。静态多态性是通过函数重载和运算符重载实现的,而动态多态性则通过虚函数和运行时多态性来实现。

静态多态性(编译时多态性)是在编译阶段确定的,主要通过函数重载和运算符重载实现。函数重载允许在同一作用域内声明多个具有相同名称但参数列表不同的函数。编译器根据调用的函数及其参数的类型来选择正确的函数。运算符重载允许用户重新定义类的操作符,以适应不同的数据类型。

动态多态性(运行时多态性)是在运行时确定的,主要通过虚函数和指针/引用实现。虚函数是在基类中声明并在派生类中重写的函数。通过使用基类的指针或引用调用虚函数时,实际执行的是派生类中的版本。这样的机制允许在运行时动态选择调用的函数,实现多态性。

总体而言,静态多态性在编译时就能确定调用的函数,而动态多态性在运行时根据对象的实际类型来确定调用的函数。这两种多态性的组合使得C++具有强大的面向对象编程能力。

静态多态性的例子,使用函数重载和运算符重载:

#include <iostream>

class StaticPolymorphismExample {
public:
    // 函数重载
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }

    // 运算符重载
    int operator+(int a) {
        return a + 10;
    }

    double operator+(double a) {
        return a + 10.5;
    }
};

int main() {
    StaticPolymorphismExample obj;

    // 函数重载
    std::cout << obj.add(5, 10) << std::endl;         // 调用int版本
    std::cout << obj.add(3.5, 7.2) << std::endl;      // 调用double版本

    // 运算符重载
    std::cout << +obj << std::endl;                   // 调用int版本
    std::cout << +3.14 << std::endl;                  // 调用double版本

    return 0;
}

动态多态性的例子,使用虚函数和基类指针:

#include <iostream>

class Base {
public:
    // 虚函数
    virtual void display() {
        std::cout << "Base class display" << std::endl;
    }
};

class Derived : public Base {
public:
    // 重写虚函数
    void display() override {
        std::cout << "Derived class display" << std::endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;

    basePtr = &derivedObj; // 使用基类指针指向派生类对象

    // 虚函数调用
    basePtr->display();    // 调用派生类的display函数

    return 0;
}

在这两个例子中,静态多态性通过函数重载和运算符重载实现,而动态多态性通过虚函数和基类指针实现。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击