• 【Java和C++】什么是多态


    2023年9月20日,周三上午

    今天写作业的时候遇到了多态,但我感觉自己多多态还是不够理解,于是又深入研究了一下。

    不过,我觉得我写的这篇文章还不够完整,比如说没提到什么时候适合使用多态,以后有空再写上吧。


    目录


    什么是多态

    多态允许不同类的对象对相同的消息(方法)作出不同的响应。

    通俗来说就是,对于同一个函数makeSound,Animal类的对象的响应是输出"发出声音",Cat类的对象的响应是输出“喵喵...”,Dog类的对象的响应是输出“汪汪...”

    多态性使得程序能够以一种通用的方式处理不同类型的数据或对象,而无需关心它们的具体类型。

    不同的编程语言中,多态性的实现方式和语法细节可能有所不同,但多态性的核心思想是相同的:允许不同类型的对象在统一的接口下表现出不同的行为


    Java

    在Java中,可以使用以下几种方法来实现多态性:

    方法重写(Method Overriding)

    这是最常见的多态性实现方式。它允许子类重写父类的方法,从而在调用相同方法名的情况下,根据对象的实际类型来执行不同的方法体。要使用方法重写,子类需要覆盖父类中的方法,并使用@Override注解确保正确地重写了方法。

    1. class Animal {
    2. void makeSound() {
    3. System.out.println("动物发出声音");
    4. }
    5. }
    6. class Dog extends Animal {
    7. @Override
    8. void makeSound() {
    9. System.out.println("汪汪");
    10. }
    11. }
    12. class Cat extends Animal {
    13. @Override
    14. void makeSound() {
    15. System.out.println("喵喵");
    16. }
    17. }

    接口(Interface)

    Java的接口允许不同的类实现相同的接口,然后通过接口引用对象,从而实现多态性。不同的类可以以不同的方式实现接口中的方法。

    1. interface Shape {
    2. void draw();
    3. }
    4. class Circle implements Shape {
    5. @Override
    6. public void draw() {
    7. System.out.println("Drawing a circle");
    8. }
    9. }
    10. class Rectangle implements Shape {
    11. @Override
    12. public void draw() {
    13. System.out.println("Drawing a rectangle");
    14. }
    15. }

    抽象类(Abstract Class)

    抽象类也可以用于实现多态性,类似于接口,子类必须实现抽象类中的抽象方法。

    1. abstract class Animal {
    2. abstract void makeSound();
    3. }
    4. class Dog extends Animal {
    5. @Override
    6. void makeSound() {
    7. System.out.println("汪汪");
    8. }
    9. }
    10. class Cat extends Animal {
    11. @Override
    12. void makeSound() {
    13. System.out.println("喵喵");
    14. }
    15. }

    泛型(Generics)

    泛型允许编写通用的代码,以处理不同类型的数据。通过使用泛型类型参数,可以在编译时确定对象的类型,并执行相应的操作。


    C++

    在C++中,有两种主要方式可以实现多态性:虚函数和函数指针。

    但是,虚函数是实现多态性的主要和推荐方式

    虚函数(Virtual Functions)

    在C++中,可以将成员函数声明为虚函数,以实现多态性。这通常用于面向对象编程中的继承和多态。虚函数通过在基类中声明并在派生类中重写来实现。这样,派生类可以为虚函数提供自己的实现,而基类的指针或引用可以用于调用这些虚函数,具体的调用会根据实际对象的类型而决定。

    1. class Animal {
    2. public:
    3. virtual void makeSound() {
    4. std::cout << "动物发出声音" << std::endl;
    5. }
    6. };
    7. class Dog : public Animal {
    8. public:
    9. void makeSound() override {
    10. std::cout << "汪汪" << std::endl;
    11. }
    12. };
    13. class Cat : public Animal {
    14. public:
    15. void makeSound() override {
    16. std::cout << "喵喵" << std::endl;
    17. }
    18. };

    使用虚函数时,可以使用基类指针或引用来实现多态性,具体执行哪个版本的函数取决于运行时对象的类型。

    函数指针(Function Pointers)

    在C++中,也可以使用函数指针来实现多态性。函数指针是指向函数的指针,可以动态指定要调用的函数。可以使用函数指针数组或函数指针成员来实现多态性,根据需要调用不同的函数。

    1. class Animal {
    2. public:
    3. void (*makeSound)() = nullptr;
    4. void playSound() {
    5. if (makeSound != nullptr) {
    6. makeSound();
    7. }
    8. }
    9. };
    10. void animalSound() {
    11. std::cout << "动物发出声音" << std::endl;
    12. }
    13. void dogSound() {
    14. std::cout << "汪汪" << std::endl;
    15. }
    16. int main() {
    17. Animal animal;
    18. animal.makeSound = animalSound;
    19. Animal dog;
    20. dog.makeSound = dogSound;
    21. animal.playSound(); // 调用 Animal 的声音函数
    22. dog.playSound(); // 调用 Dog 的声音函数
    23. return 0;
    24. }

    这种方法允许在运行时选择要调用的函数,但相对于虚函数,它更为复杂,需要手动管理函数指针。

    总结来说,在C++中,虚函数是实现多态性的主要和推荐方式,因为它更容易使用并且具有更好的可读性和维护性。函数指针可以用于实现多态性,但它通常更适用于特定的高级用例,比如函数回调。虚函数是C++中实现多态性的首选方式

  • 相关阅读:
    CRM客户管理系统源码 带移动端APP+H5+小程序
    springboot(spring)整合redis(集群)、细节、底层配置讲解
    破解校园数字安全难点,联想推出智慧教育安全体系
    idea导入maven web项目,增加tomcat服务器
    ardupilot开发 ---传感器驱动,外设驱动篇
    【工艺库】SMIC数字后端工艺库
    移动设备管理(MDM):密码管理
    react面试题
    新媒体营销实训解决方案
    c++ 类中隐藏的六个(c11之后 八个)默认函数
  • 原文地址:https://blog.csdn.net/m0_61629312/article/details/133087646