zoukankan      html  css  js  c++  java
  • C++学习笔记-多态

    多态指不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。多态存在于具有继承关系的类中,当父类函数被申明为虚函数,子类重写了父类虚函数时,就具备了多态发生的条件。

    多态

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    /* C++学习笔记:面向对象,多态*/
    #include <iostream>
    
    class Animal
    {
    public:
        void bark()
        {
            std::cout << "动物叫..." << std::endl;
        }
    };
    
    class Dog: public Animal
    {
    public:
        void bark()
        {
            std::cout << "wang wang wang ..." << std::endl;
        }
    };
    
    class Cat: public Animal
    {
    public:
        void bark()
        {
            std::cout << "miao miao miao ..." << std::endl;
        }
    };
    
    void animalBark(Animal *animal)
    {
        animal->bark();
    }
    
    int main()
    {
        Animal *animal = new Animal();
        Dog *dog = new Dog();
        Cat *cat = new Cat();
    
        animalBark(animal);
        animalBark(dog);
        animalBark(cat);
    
        return 0;
    }
    
    1
    2
    3
    
    动物叫...
    动物叫...
    动物叫...
    

    父类函数添加 virtual ,将其声明为虚函数。

    1
    2
    3
    4
    5
    6
    7
    8
    
    class Animal
    {
    public:
        virtual void bark()
        {
            std::cout << "动物叫..." << std::endl;
        }
    };
    
    1
    2
    3
    
    动物叫...
    wang wang wang ...
    miao miao miao ...
    

    基类中的虚函数是一个使用关键字 virtual 声明的函数。派生类中已经对函数进行定义的情况下,定义一个基类的虚函数,就是要告诉编译器我们不想对这个函数进行静态链接。

    我们所希望的是根据调用函数的对象的类型对程序中在任何给定指针中被调用的函数的选择。这种操作被称为动态链接,或者后期绑定。

    多态的三个条件

    1. 类间存在继承
    2. 要有虚函数重写
    3. 父类指针或引用指向子类对象

    重载、重写、重定义

    重载:同一个类中函数名相同,参数列表相同。以下代码表示 bark() 函数的重载。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    class Animal
    {
    private:
        std::string name;
    
    public:
        virtual void bark()
        {
            std::cout << "动物叫..." << std::endl;
        }
        
        virtual void bark(std::string name)
        {
            std::cout << name << "正在叫..." << std::endl;
        }
    };
    

    重写:指子类覆盖父类的虚函数,要求函数名和参数均相同,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    class Animal
    {
    public:
        virtual void bark()
        {
            std::cout << "动物叫..." << std::endl;
        }
    };
    
    class Dog: public Animal
    {
    public:
        void bark()
        {
            std::cout << "wang wang wang ..." << std::endl;
        }
    };
    
  • 相关阅读:
    大数据技术栈,主要有哪些
    微服务海量日志监控平台
    Elastic APM安装
    Elasticsearch SSL认证/证书制作
    Elastic APM 上报数据分析与应用
    elasticsearch7.X x-pack破解
    Netty源码学习系列之5-NioEventLoop的run方法
    Netty源码学习系列之4-ServerBootstrap的bind方法
    Netty源码学习系列之3-ServerBootstrap的初始化
    Netty源码学习系列之2-NioEventLoopGroup的初始化
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185150.html
Copyright © 2011-2022 走看看