• C++ 多态性和虚函数


    2017-06-27 19:17:52

    C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助。

    一、多态的作用:

    1. 隐藏实现细节,使得代码能够模块化;
    2. 接口重用,实现“一个接口,多种方法”;

    二、虚函数的声明:

    class Base

    {

      virtual 返回值类型 函数名(形参表){}

    }

    • 当基类的某个成员函数被声明为虚函数后,其子类中的函数如果返回值类型,函数名,形参表一致的话,不论是否加了virtual关键字,都会被认为是虚函数。反之,则是同名隐藏。
    • virtual关键字只是在类中声明的时候必须加上,在类外定义的时候不需要加virtual关键字
    • 构造函数,静态成员函数不能是虚函数,析构函数可以是虚函数,甚至鼓励将析构函数写成虚函数
    • 只有通过基类的对象指针,基类的对象引用来调用派生类的虚函数,才能体现虚函数的特性。单纯通过子类来调用虚函数是无法体现这种动态联编的特性的。

                                    A* p=&b

                                    A& p=b

    三、多态性的实现

    可以使用基类的对象指针来先后指向同一类族中的不同类对象,以便使用相同的调用方法去调用不同派生类的同名虚函数。

    class A
    {
        int a;
    public:
        A(int x)
        {
            a=x;
        }
    
        virtual void get(){cout<<"A::"<<a<<endl;}
    };
    
    class B:public A
    {
        int b;
    public:
        B(int x,int y):A(x)
        {
            b=y;
        }
    
        void get(){cout<<"B::"<<b<<endl;}
    };
    
    class C:public B
    {
        int c;
    public:
        C(int x,int y,int z):B(x,y)
        {
            c=z;
        }
    
        void get(){cout<<"C::"<<c<<endl;}
    };
    
    int main()
    { 
        C c1(1,2,3);
        A* p1=&c1;
        B* p2=&c1;
        p1->get();
        p2->get();
        return 0; 
    }

     四、纯虚函数

    定义一个基类的时候如果还无法给出虚函数的具体实现方式,可以将之声明为纯虚函数,纯虚函数的实现完全依赖于各个派生类。

    纯虚函数的声明:

    virtual 返回值类型 函数名(形参表)=0;

    • 因为无法给出纯虚函数的定义所以没有函数体,没有函数体和函数体为空是两个概念,要加以区分;
    • 函数名赋值为0,本质上是将指向该函数的指针的地址赋值为0。在派生类没有重定义之前是无法加以使用的。

    五、抽象类

    抽象类是指无法定义对象只能作为基类的一种特殊的类,但是可以定义对象指针,目的是为了实现多态性。

    抽象类有两种:

    1. 有纯虚函数的基类
    2. 构造函数或者析构函数被定义为protected访问
  • 相关阅读:
    C# winform 使用FastReport.Net自动打印一维码条码和二维码的解决方法
    C# winform 使用rdlc打印小票其中包含动态显示多条形码的解决方法
    我学习的LIS系统业务
    C# DataTable DataSet DataRow 转实体类集合,实体类和实体类集合转成DataTable 扩展方法分享
    我的自动化设备上位机软件开发设计(一)
    打开操作系统数据执行保护,关闭操作系统数据执行保护
    visualstudio2019 的报表技术rdlc在windows10上出现乱码的问题解决方法
    我带旅游ERP管理系统开发的经历
    C# web程序,winform程序,控制台程序配置log4net,使用log4net
    freemodbus modbus TCP 学习笔记
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/7086759.html
Copyright © 2020-2023  润新知