• 静态联编和动态联编即多态的概念


    多态的成立条件

    • 有继承
    • 子类重写父类虚函数函数
    1.  返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外)
    2.  子类中virtual关键字可写可不写,建议写
    • 类型兼容,父类指针,父类引用 指向 子类对象

    多态分类

    • 静态多态  函数重载
    • 动态多态 虚函数 继承关系

    c++支持编译时多态(静态多态)和运行时多态(动态多态),运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。

    静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    class Animal
    {
    public:
        virtual void speak()
        {
            cout << "动物在叫" << endl;
        }
    };
    class Cat :public Animal
    {
    public:
        void speak()
        {
            cout << "喵喵。。。" << endl;
        }
    };
    //调用doSpeak, speak函数的地址早就绑定好了, 早绑定(即 静态联编:编译阶段就确定好了地址)
    //如果想调用猫的speak, 不能提前绑定好函数的地址了,所以需要在运行时再去确定函数地址
    //动态联编: 写法  doSpeak绑定的方法改为虚函数 在父类上声明虚函数, 发生了多态
    //多态概念:父类的引用或者指针指向子类对象
    void doSpeak(Animal& animal)
    {
        animal.speak();
    }
    //如果发生了继承关系,编译器允许进行类型转换
    void test01()
    {
        Cat cat;
        doSpeak(cat);
    }
    
    int main()
    {
        test01();
        system("Pause");
        return 0;
    }

    结果:

  • 相关阅读:
    MySQL mysqldump数据导出详解
    FTP上传下载 C#辅助类
    FastDFS java 辅助类
    Ajax 提交表单【包括文件上传】
    bootstrap-table 基础用法
    MVC dropdownlist 后端设置select属性后前端依然不能默认选中的解决方法
    jQuery实现鼠标移到元素上动态提示消息框效果
    给Jquery动态添加的元素添加事件
    centos7部署mysql5.7一主多从
    iOS浏览器 new Date() 返回 NaN
  • 原文地址:https://www.cnblogs.com/yifengs/p/15177925.html
Copyright © 2020-2023  润新知