• 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;
        }
    };
    
  • 相关阅读:
    Douglas-Peucker 轨迹压缩算法
    Marching squares 算法 获取轮廓(contour tracing)
    创建Mesh->格子地图转NavMesh->可破坏墙壁
    StretchedBillboard 实现
    程序员的微创业
    买云服务器有推荐吗?国内知道有腾讯云、阿里云...等等,不知道该选哪个好了,另外优惠吗?
    我的阿里云5年
    2021阿里云、腾讯云、华为云、滴滴云评测比较
    终于找到可以一文多发的平台了!
    2019年最新阿里云主机优惠购买指南
  • 原文地址:https://www.cnblogs.com/shuiyj/p/13185150.html
Copyright © 2020-2023  润新知