这是她 发表于 2020-5-17 21:24:32

C++旅程第八站------类的多态

本帖最后由 这是她 于 2020-5-17 21:24 编辑

The kind of beauty i want most is the hard-to-get kind that comes from within——strenght,courage,dignity.            ---Ruby Dee
                                                                                                                  多态
            分类:
            1、静态多态:函数重载和运算符重载属于静态多态,复用函数名
            2、动态多态:派生类和虚函数实现运行时多态

             静态多态和动态多态的区别:
            1、静态多态的函数地址早绑定,编译阶段确定函数地址;
            2、动态多态的函数地址晚绑定,运行阶段确定函数地址;
#include<iostream>

using namespace std;

class Figure
{
      public:
                void Show_a()
                {
                        cout << "Figure::Show_a!!!!!!!!" << endl;
                }
               
                //虚函数----------Show_b 函数就是虚函数
                //虚函数---在函数前面加上virtual关键字变成虚函数------这样编译器在编译的时候就不能确定函数调用了,在运行阶段确定
                virtual void Show_b()
                {
                        cout << "Figure::Show_b!!!!!!!!!!" << endl;
                }
};

//函数重写-----函数返回值类型、函数名、参数列表完全一致
class Diamond : public Figure
{
      public:
                void Show_a()
                {
                        cout << "Diamond::Show_a!!!!!!!!!" << endl;
                }
               
                void Show_b()
                {
                        cout << "Diamond::Show_b!!!!!!!!!" << endl;
                }
};

class Square : public Figure
{
      public:
                void Show_a()
                {
                        cout << "Square::Show_a!!!!!!!!!!!" << endl;
                }
               
                void Show_b()
                {
                        cout << "Square::Show_b!!!!!!!!!!!" << endl;
                }
};

//地址早绑定--在编译阶段就确定了函数地址

//父类的指针或引用---指向于类对象
void Doshow_a(Figure & figure)
{
      figure.Show_a();
}

//地址晚绑定--在运行阶段确定函数地址
//你想传入什么对象,就可以调用什么对象的函数
void Doshow_b(Figure * figure)
{
      figure->Show_b();
}

//动态多态满足条件:
//1、有继承关系;
//2、子类重写父类的虚函数;

//动态多态使用
//父类的指针或引用指向子类对象;

int main()
{
      Diamond d1;
      Doshow_a(d1);
      
      Square s1;
      Doshow_a(s1);
      
      cout << "---------------------------------------" << endl;
      
      Diamond d2;
      Doshow_b(&d2);
      
      Square s2;
      Doshow_b(&s2);
      
      return 0;
}          运行结果:
Figure::Show_a!!!!!!!!
Figure::Show_a!!!!!!!!
---------------------------------------
Diamond::Show_b!!!!!!!!!
Square::Show_b!!!!!!!!!!!

                                       {:9_223:} 渣渣来报道求大佬指点{:10_254:}

页: [1]
查看完整版本: C++旅程第八站------类的多态