• C++入门经典-例8.7-多态,利用虚函数实现动态绑定


    1:多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统。在C++语言中,多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数,发出同样的消息被不同类型的对象接受时,将导致完全不同的行为。这里所说的消息主要是指类的成员函数的调用,而不同的行为是指不同的实现。

        多态通过联编实现。联编是指一个计算机程序自身彼此关联的过程。按照联编说进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。C++中,根据两边的时刻不同,有两种类型的多态性,即函数重载和虚函数。

    2:虚函数概述

        在类的继承层次结构中,不同的层次中可以出现名字、参数个数和类型都相同而功能不同的函数。编译器按照先子类后父类的顺序进行查找覆盖,如果子类有与父类相同原形的成员函数时,要想调用父类的成员函数,需要对父类重新引用调用。虚函数则可以解决子类和父类相同原型成员函数的函数调用问题。虚函数允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

        在基类中,用virtual声明成员函数为虚函数,在派生类中重新定义此函数,改变该函数的功能。在C++语言中虚函数可以继承,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动称为虚函数,但如果派生类没有覆盖基类的虚函数,则调用时调用基类的函数定义。

        覆盖和重载的区别是,重载是同一层次函数名相同,覆盖则是在继承层次中成员函数的函数原型完全相同。

    3:利用虚函数实现动态绑定

        多态主要体现在虚函数上,只要有虚函数存在,对象类型就会在程序运行时动态绑定。动态绑定的实现方法是定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象,通过该指针变量调用此虚函数。

    代码如下:

    // 8.7.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    class CEmployee                                //定义CEmployee类
    {
    public:
        int m_ID;                                    //定义数据成员
        char m_Name[128];                            //定义数据成员
        char m_Depart[128];                            //定义数据成员
        CEmployee()                                //定义构造函数
        {
            memset(m_Name,0,128);                    //初始化数据成员
            memset(m_Depart,0,128);                //初始化数据成员
        }
        virtual void OutputName()                        //定义一个虚成员函数
        {
            cout << "员工姓名: "<<m_Name << endl;        //输出信息
        }
    };
    class COperator :public CEmployee                    //从CEmployee类派生一个子类
    {
    public:
        char m_Password[128];                        //定义数据成员
        void OutputName()                            //定义OutputName虚函数
        {
            cout << "操作员姓名: "<<m_Name<< endl;    //输出信息
        }
    };
    int main(int argc, char* argv[])
    {
        CEmployee *pWorker = new COperator();//定义CEmployee类型指针,调用COperator类构造函数
        strcpy(pWorker->m_Name,"MR");                //设置m_Name数据成员信息
        pWorker->OutputName();                        //调用COperator类的OutputName成员函数
        delete pWorker;                            //释放对象
        return 0;
    }
    View Code

    运行结果:

        上述代码中,在CEmployee类中定义了一个虚函数OutputName,在之类COperator中改写了OutputName成员函数,其中COperator类中的OutputName成员函数即使没有使用virtual关键字仍为虚函数。下面定义一个CEmployee类型的指针,调用COperator 类的构造对象。

        虚函数有以下几方面的限制。

    (1)只有类的成员函数才能为虚函数。

    (2)静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。

    (3)内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。

    (4)构造函数不能是虚函数,析构函数通常是虚函数。

  • 相关阅读:
    面向对象总结
    面向对象进阶
    day21
    组合、封装、多态
    作业20
    继承、派生、新式类与经典类
    作业
    面向对象基础
    代码统计小程序
    使用WampServer搭建本地PHP环境,绑定域名,配置伪静态
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7571569.html
Copyright © 2020-2023  润新知