当前位置: 首页 > article >正文

C++的多态(Polymorphism)

C++中的多态(Polymorphism)是面向对象编程的一个重要概念,它允许以不同的方式使用同一个接口来处理不同类型的对象。多态性可以通过函数重载、运算符重载和虚函数实现。

多态的基本概念是:通过基类的指针或引用,可以在运行时动态地确定所调用的函数,从而实现不同类型的对象的特定行为。

  1. 静态多态性(静态多态):
    静态多态性是通过函数重载和运算符重载实现的。在编译时期,根据函数或运算符的参数类型或个数,选择调用对应的函数或运算符。

示例:

class MyClass {
public:
    void display(int num) {
        cout << "Displaying an integer: " << num << endl;
    }

    void display(double num) {
        cout << "Displaying a double: " << num << endl;
    }
};

int main() {
    MyClass obj;
    obj.display(10);      // 调用 void display(int num)
    obj.display(3.14);    // 调用 void display(double num)

    return 0;
}

在上述示例中,MyClass 类定义了两个重载的 display 函数,一个接受整数参数,一个接受浮点数参数。在 main 函数中,我们通过对象 obj 调用 display 函数,编译器根据实参的类型自动选择调用合适的函数。

  1. 动态多态性(动态多态):
    动态多态性是通过虚函数和基类的指针或引用实现的。在运行时期,根据实际对象的类型,动态地确定调用的函数。

示例:

class Animal {
public:
    virtual void makeSound() {
        cout << "Animal is making a sound." << endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        cout << "Dog is barking." << endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        cout << "Cat is meowing." << endl;
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->makeSound();   // 调用 Dog 的 makeSound() 函数
    animal2->makeSound();   // 调用 Cat 的 makeSound() 函数

    delete animal1;
    delete animal2;

    return 0;
}

在上述示例中,Animal 类是基类,Dog 类和 Cat 类是派生类。基类中的 makeSound 函数声明为虚函数,并在派生类中进行了重写。在 main 函数中,我们使用基类的指针 animal1animal2 分别指向派生类的对象 DogCat,然后通过这些指针调用 makeSound 函数。在运行时期,根据指针所指向的对象的实际类型,动态地确定调用的函数。

动态多态性通过虚函数实现了运行时多态,使得程序可以根据实际对象的类型来确定调用的函数,从而实现了灵活的对象行为。


总结:
多态性是面向对象编程的重要特性之一,它允许以不同的方式处理不同类型的对象。静态多态通过函数重载和运算符重载实现,而动态多态通过虚函数和基类的指针或引用实现。多态性提高了代码的灵活性和可扩展性,使得程序可以根据实际情况进行动态决策。


http://www.kler.cn/news/233210.html

相关文章:

  • 电商小程序02数据源设计
  • 在Visual Studio中引用和链接OpenSceneGraph (OSG) 库
  • Blazor Wasm 身份验证和授权之 OpenID 与 OAuth2
  • springboot169基于vue的工厂车间管理系统的设计
  • 【OpenCV入门讲解——超详细】
  • 【Spring】Bean 的生命周期
  • 江科大STM32 终
  • 瑞芯微推理RKNN使用
  • 传输频宽是啥?对网速影响有多大?
  • 【MySQL进阶之路】磁盘随机读写和顺序读写对MySQL性能的影响
  • 《动手学深度学习(PyTorch版)》笔记7.7
  • Git 消除对某个文件的追踪
  • 【代码】Processing笔触手写板笔刷代码合集
  • 【0256】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(二)
  • C++初阶篇----新手进村
  • 微服务组件
  • go语言进阶篇——面向对象(一)
  • Redis 使用 RDB 持久化方式的过程
  • 基于鲲鹏服务器的LNMP配置
  • 机器学习:回归决策树(Python)
  • re:从0开始的CSS学习之路 7. 盒子模型
  • AR特效自研AI算法技术解决方案
  • JVM之GC垃圾回收
  • Ubuntu22.04安装黑屏(进入U盘安装引导时 和 安装完成后)
  • 【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数
  • 力扣刷题之旅:进阶篇(四)—— 滑动窗口问题
  • 牛客网SQL进阶127: 月总刷题数和日均刷题数
  • 【kafka】使用kafka client连接 kerberos认证的 kafka,scala版
  • 书生·浦语大模型第三课作业
  • Blender教程(基础)--试图的显示模式-22