c++语言中虚函数实现多态的原理详解

当一个类中有虚函数时,编译器会在这个类的对象中生成一个虚函数表,表中存储着虚函数的地址。当这个类产生派生类并且派生类中也定义了虚函数时,这个派生类会继承父类的虚函数表,然后在自己的虚函数表中添加自己的虚函数或者重载父类中的虚函数,这个过程叫做动态联编。

使用虚函数可以实现多态,多态可以让不同的子类对象调用相同的虚函数,实现统一的行为表现,提高了代码的复用性和维护性。

下面分别用两条示例说明虚函数实现多态的原理。

示例一:

#include <iostream>
using namespace std;

class Animal{
public:
    virtual void speak(){
        cout << "动物在说话" << endl;
    }
};

class Cat : public Animal{
public:
    void speak(){
        cout << "小猫在说话" << endl;
    }
};

class Dog : public Animal{
public:
    void speak(){
        cout << "小狗在说话" << endl;
    }
};

int main()
{
    Animal *animal1;
    Cat cat1;
    Dog dog1;

    animal1 = &cat1;
    animal1->speak();

    animal1 = &dog1;
    animal1->speak();

    return 0;
}

示例说明:

  • 定义了一个动物类,其中speak虚函数在子类中被重载。
  • 定义了两个子类,分别是猫和狗,这两个子类都重载了speak函数。
  • 在主函数中创建了一个动物指针类型的指针变量,animal1。
  • 首先将这个指针指向猫对象cat1,调用animal1->speak()函数,此时输出“小猫在说话”。
  • 然后将这个指针指向狗对象dog1,再次调用animal1->speak()函数,此时输出“小狗在说话”。

原因分析:

  • 通过animal1指针指向不同的对象,虽然调用的函数名称相同,但却实现了不同的行为,实现了多态。
  • 在当下的编译器实现中,调用函数时,首先查找使用virtual关键字定义的函数,如果没有找到虚函数,则使用重载过的函数,如果还没有找到,则找到与函数名称相同的函数。

示例二:

#include <iostream>
using namespace std;

class Parent{
public:
    int num;
    virtual void func(){
        cout << "This is Parent's func" << endl;
    }
};

class Child : public Parent{
public:
    int num;
    void func(){
        cout << "This is Child's func" << endl;
    }
};

int main()
{
    Parent *pParent = new Child();
    pParent->num = 1; // 父类中num的值
    static_cast<Child *>(pParent)->num = 2; // 子类中num的值
    cout << "num in Parent: " << pParent->num << endl;
    cout << "num in Child: " << static_cast<Child *>(pParent)->num << endl;

    pParent->func(); // 多态,调用子类中重载的虚函数

    delete pParent;
    return 0;
}

示例说明:

  • 定义了一个父类,其中定义了一个变量num和一个虚函数func。
  • 定义了一个子类,也包含了一个变量num和一个重载了虚函数func的同名函数。
  • 在主函数中通过一个Parent指针指向一个Child对象,这个过程中实现了向上转型。同时,在对Parent指针类型变量进行操作时,会使用父类中的变量和函数。
  • 通过static_cast强制类型转换获取Child对象中的num值进行操作。
  • 调用pParent指针类型变量的func函数,这里实现了多态。

原因分析:

  • pParent通过指向子类对象实现了向上转型,实现了父类指针指向子类对象的行为表现。
  • 使用Cast操作符将parent类型的指针转化为指向子类对象的child类型的指针,实现了对子类对象中num变量的操作。
  • 多态中使用的是编译器查找虚函数的方式,调用的是子类中重载的虚函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++语言中虚函数实现多态的原理详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 小程序开发工具全新上线

    小程序开发工具全新上线攻略 最近,小程序开发工具全新上线了,让开发者们更加便捷地进行小程序的开发。本篇攻略将详细介绍新版小程序开发工具的主要功能及使用方法,帮助各位开发者更快更好地上手。 下载安装小程序开发工具 首先,在前往小程序官网的开发者中心注册账号并创建小程序后,我们需要下载并安装小程序开发工具。具体操作如下: 打开小程序开发者工具官网,点击“立即下载…

    other 2023年6月26日
    00
  • 手机抓包fiddle4的安装及配置

    以下是“手机抓包fiddle4的安装及配置的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: 手机抓包fiddle4的安装及配置 Fiddler是一款常用的抓包工具,可以用于分析HTTP/HTTPS流量。本文将介绍如何安装和配置Fiddler4,以及如何在手机上使用Fiddler4进行抓包。 1. 安装Fiddler4 以下是安装Fiddl…

    other 2023年5月10日
    00
  • Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例

    首先,我们需要了解什么是list_to_tree。这是一个 Thinkphp 框架提供的函数,用于将一个平面的数组转换成树形结构,也就是将数组中的每一个节点,根据其在数组中的位置关系,转换成一颗多级的树状结构。在无限级分类方面,它经常用于将分类节点表中的数据从平面的列表格式,转换成具有层级关系的树形结构。 下面是 Thinkphp 框架使用 list_to_…

    other 2023年6月27日
    00
  • 利用JS重写Cognos右键菜单的实现代码

    下面我将为大家详细讲解如何利用JS重写Cognos右键菜单的实现代码。 1. 了解Cognos右键菜单实现代码 要重写Cognos右键菜单的实现代码,首先需要了解原始代码是如何实现的。在Cognos报表中,当用户右键点击报表上的某个元素时,会弹出默认的右键菜单。这个右键菜单是由Cognos自己的代码实现的,我们需要在此基础上重写。 2. 创建自定义右键菜单 …

    other 2023年6月27日
    00
  • java验证码功能的实现方法

    Java验证码功能的实现方法可以分为以下几个步骤: 生成验证码图片:使用Java的Graphics2D类和BufferedImage类生成验证码图片。可以使用随机数生成器生成随机的字符和颜色,然后将字符绘制到图片上。 将验证码图片输出到客户端:使用Java的Servlet API将验证码图片输出到客户端。可以使用HttpServletResponse类的ge…

    other 2023年5月9日
    00
  • 数字信号处理实验(六)——fir滤波器的设计

    数字信号处理实验(六)——fir滤波器的设计 前言 在数字信号处理中,滤波器是非常重要的一部分。滤波器可以改变信号的频率分量,实现对信号的去噪、分析、增益等操作。本篇文章将着重介绍fir滤波器,它是一种常用的数字滤波器,广泛应用于信号处理领域中。 fir滤波器是什么 fir滤波器全称为Finite Impulse Response,它的特点是在时域上为有限长…

    其他 2023年3月28日
    00
  • ZeroMQ接口函数之 :zmq_disconnect – 断开一个socket的连接

    ZeroMQ接口函数之zmq_disconnect-断开一个socket的连接的完整攻略 zmq_disconnect是ZeroMQ库中的一个接口函数,它可以用于断开一个socket的连接。本文将为您提供一份完整攻略,包括zmq_disconnect的基本原理、使用方法、示例说明等。 zmq_disconnect的基本原理 zmq_disconnect函数可…

    other 2023年5月5日
    00
  • 解析从小程序开发者工具源码看原理实现

    这里我将详细讲解解析从小程序开发者工具源码看原理实现的完整攻略。 前言 如今,小程序已经成为了移动互联网的一个重要组成部分,而小程序开发者工具则是小程序开发的必备工具。对于一个开发者而言,了解小程序开发者工具的原理实现,将有助于更好地了解小程序的开发和调试。 步骤 以下为从小程序开发者工具源码看原理实现的攻略步骤: 1. 下载开发者工具源码 可以从小程序官网…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部