C++_18_多态 - 重写版

  多态:

    面向对象三大概念:封装、继承、多态!可想而知多态是何等的重要

              什么是多态?
      简单来讲就是通过 “虚函数” + “指向子类对象的父类指针”,实现对基类派生出来的不同子类的“统一操作”的过程,实际上就是实现“操作”代码复用;

      因为子类都是由统一父类派生出来的,因此可以通过共同父类 “虚函数” 操作子类,再通过 “指向子类对象的父类指针” 做统一操作

  因此要想形成多态必须具备以下三个条件:
    1、必须存在继承关系;
    2、继承关系中必须有同名的虚函数;----- 通过父类虚函数实现子类重写,实现子类多态度操作;
      (函数类内定义前加 virtual)(虚函数存在的意义就是为实现多态,是以继承为基础才形成的概念)
    3、存在指向子类对象的父类指针或引用 ----- 通过该指针或引用调用到父类虚函数,再通过虚函数执行对于子类函数操作
      导致=====>>>》  基类指针或引用指向哪个(基类或者派生类的)虚函数,就执行哪个(基类或者派生类的)虚函数

   顶层函数属于实现特定功能的函数,和类的概念有些区别,属于对象那个层次的函数

#include <iostream>
using namespace std;

//父类
class  Human{
    public:
        virtual void toilet() = 0;
};

//子类1
class Man:public Human{
    public:
        void toilet(){
            cout<<"我去男厕所"<<endl;
        }
};

//子类2
class Woman:public Human{
    public:
        void toilet(){
            cout<<"我去女厕所"<<endl;
        }
};

//子类3
class Non:public Human{
    public:
        void toilet(){
            cout<<"我去无性别厕所"<<endl;
        }
};

//多态复用函数
void func(Human * human){
    human->toilet();
}

int main(){
    Man man1,man2,mnan3;
    Woman woman1,woman2,woman3;
    Non non1,non2,non3;

    func(&man1);   //我去男厕所
    func(&woman2); //我去女厕所
    func(&non3);   //我去无性别厕所

    return 0;
}

zl@DESKTOP-7K59BF4:/mnt/c/Users/ZL/Desktop$ ./12
我去男厕所
我去女厕所
我去无性别厕所

 

 

  多态的概念以及前提条件:
    编译期绑定(静态联编):
函数入口地址和函数名在编译期间绑定,即编译期间确定函数名和入口地址唯一对应
    运行期绑定(动态联编):
函数入口地址和函数名在编译期间不绑定,反而在运行程序时才根据需要再动态组合绑定
    多态:就是要做到同一个函数名在调用的时候,可以根据需求随时绑定不同的入口地址,实现不同函数对应的效果!
        直白理解就是函数名还是那一个,只不过在具体执行时候借助函数名绑定的指针(存放入口地址)存入不同的入口地址(不同的类的)

 

posted @ 2023-12-04 00:00  尘落曦枫  阅读(30)  评论(0)    收藏  举报