iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于虚函数实现多态的原理及分析
  • 190
分享到

关于虚函数实现多态的原理及分析

虚函数虚函数实现多态多态的原理 2023-02-05 18:02:38 190人浏览 八月长安
摘要

目录1、c++中如何实现多态2、虚函数实现多态的原理2.1 单类继承2.2 多类继承示例总结1、C++中如何实现多态 基类中先声明一个虚函数至少有一个继承该基类的子类 2、虚函数实现

1、C++中如何实现多态

  • 基类中先声明一个虚函数
  • 至少有一个继承该基类的子类

2、虚函数实现多态的原理

  • 当一个类中出现虚函数或着子类继承了虚函数时,就会在该类中产生一个虚函数表(virtual table),虚函数表实际上是一个函数指针数组(在有的编译器作用下是链表),里面的每一个元素对应指向该类中的某一个虚函数的指针。
  • 被该类声明的对象会包含一个虚函数表指针(virtual table pointer),指向该类的虚函数表的地址。
  • 虚函数的调用过程: 当一个对象要调用到虚函数时,先将对象内存中的vptr指针(虚函数表指针)指向定义该类的vtbl(虚函数表),vtbl再寻找里面的指针指向想要调用的虚函数,从而完成虚函数的调用。

2.1 单类继承

定义一个父类

class Person{
public:
	virtual void f(){cout << "use f()" << endl;}
	virtual void g(){cout << "use g()" << endl;}
	virtual void h(){cout << "use h()" << endl;}
};

父类对象其在内存中布局如下:

  • 再定义一个子类,此时并不覆盖父类的虚函数:
class Bag:public Person{
public:
	virtual void i(){cout << "use i()" << endl;}
	virtual void j(){cout << "use j()" << endl;}
};

可以看出虚函数表内的虚函数是按声明顺序进行排序

父类虚函数排在子类虚函数之前

  • 当我们把子类中的虚函数覆盖掉:(修改Bag类)
class Bag:public Person{
public:
	void f(){cout << "class Bag use fun" << endl;}
	virtual void i(){cout << "use i()" << endl;}
	virtual void j(){cout << "use j()" << endl;}
}; 

子类覆盖的虚函数,放在父类原先放该虚函数的位置上。

所以当父类指针指向该子类对象时,会调用该子类的重载函数

2.2 多类继承

  • 子类没有覆盖父类的虚函数

子类的虚函数放在第一张虚函数表中,紧跟着第一个父类的虚函数

如果每个父类都有虚函数,则有几个父类就有几张虚函数表

  • 子类覆盖父类的虚函数

父类的虚函数被子类覆盖后,则该子类对应的重载函数的位置在被覆盖的父类函数的位置上。(如果父类没有该虚函数,则不用被覆盖)

父类的虚函数被子类覆盖后,则父类指针指向该子类对象时,调用的f()便是子类中重载的f()

示例

#include <iOStream>
using namespace std;

class Person1{
public:
    virtual void f(){}
    virtual void g(){}
    virtual void h(){}
    virtual ~Person1(){}
};

class Person2{
public:
    virtual void f(){}
    virtual void g(){}
    virtual void h(){}
    void a(){           // 成员函数,不需要重载
        cout << "class Person2" << endl;
    }
    virtual ~Person2(){}
};

class Person3{
public:
    virtual void g(){}
    virtual void h(){}
    virtual ~Person3(){}
};

class Bag:public Person1, public Person2, public Person3{
public:
    void f(){
        cout << "Bag f()" << endl;
    }
    void g(){
        cout << "Bag g()" << endl;
    }
    void a(){
        cout << "Class Bag" << endl;
    }
};

int main(int arGC, char const *argv[])
{
    Person3* p3 = new Bag;
    //p3->f();    // P3 没有成员函数f()
                  // 多态首先得是 父类有虚函数,其次是子类要定义该函数的重载
                  // 如果父类的虚函数改为成员函数,则子类无法进行重载,即无法实现多态
    delete p3;
    p3 = NULL;

    Person1* p1 = new Bag;
    p1->f();
    delete p1;
    p1 = NULL;

    Person2* p2 = new Bag;
    p2->a();
    delete p2;
    p2 = NULL;
    
    return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 关于虚函数实现多态的原理及分析

本文链接: https://www.lsjlt.com/news/194261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于虚函数实现多态的原理及分析
    目录1、C++中如何实现多态2、虚函数实现多态的原理2.1 单类继承2.2 多类继承示例总结1、C++中如何实现多态 基类中先声明一个虚函数至少有一个继承该基类的子类 2、虚函数实现...
    99+
    2023-02-05
    虚函数 虚函数实现多态 多态的原理
  • C++中的多态问题—理解虚函数表及多态实现原理
    目录一、多态的概念概念构成条件二、虚函数的重写重写的定义重写的特殊情况override和final关键字区分重写、重载、重定义抽象类的概念三、多态的实现原理父类对象模型补充:生成默认...
    99+
    2023-02-05
    C++中的多态 C++虚函数表 C++多态实现原理
  • C++的多态和虚函数实例分析
    这篇文章主要介绍了C++的多态和虚函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的多态和虚函数实例分析文章都会有所收获,下面我们一起来看看吧。一、C++的面试常考点阿里虽然是国内Java的第一...
    99+
    2023-06-29
  • 详解C++虚函数中多态性的实现原理
    目录什么是虚函数多态性的实现多态的底层原理多态性的好处总结在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C++是一种...
    99+
    2023-05-19
    C++虚函数的多态性原理 C++虚函数 多态性 C++虚函数
  • C++多态的实现与原理及抽象类实例分析
    这篇文章主要讲解了“C++多态的实现与原理及抽象类实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++多态的实现与原理及抽象类实例分析”吧!多态的概念多态: 从字面意思来看,就是事物...
    99+
    2023-06-29
  • C++数据结构分析多态的实现与原理及抽象类
    目录多态的概念虚函数多态构成的条件C++11override和final重载、重写和重定义(隐藏)抽象类多态的原理虚函数表原理单继承和多继承的虚表单继承的虚表多继承的虚函数表几个值得...
    99+
    2024-04-02
  • react中关于函数调用()与bindthis的原因及分析
    目录关于函数调用()与bind this的原因答1答2总结关于函数调用()与bind this的原因 以下内容主要基于onClick的回调函数解决方案 官方文档对于jsx回调函数解释...
    99+
    2023-02-12
    react bind this react bind this的原因 react函数调用
  • C++虚函数表与多态实例代码分析
    这篇文章主要介绍“C++虚函数表与多态实例代码分析”,在日常操作中,相信很多人在C++虚函数表与多态实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表与多态实例代码分析”的疑惑有所帮助!...
    99+
    2023-07-05
  • C++ 超详细分析多态的原理与实现
    目录多态的定义及实现多态的构成条件虚函数重写C++11的override和final抽象类多态的原理虚函数表动态绑定与静态绑定单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的...
    99+
    2024-04-02
  • C++虚函数和多态超详细分析
    目录1.什么是虚函数2.纯虚函数3.c++多态4.纯虚函数和ADT过程5.虚析构函数6.dynamic_cast类型转换7.成员函数指针 1.什么是虚函数 C++类中用virtual...
    99+
    2023-01-28
    C++虚函数和多态 C++虚函数 C++多态
  • C/C++多态原理实例分析
    本篇内容介绍了“C/C++多态原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多态面向对象编程有三大特性:继承、封装和多态。其中,...
    99+
    2023-07-02
  • C++ 多态虚函数的底层原理深入理解
    目录1 多态的基本概念1.1 什么是多态1.2 怎么实现多态2 虚函数的底层原理1 多态的基本概念 1.1 什么是多态 多态是在不同继承关系的类对象,去调用同一函...
    99+
    2022-11-13
    C++ 多态虚函数底层原理 C++ 多态虚函数
  • 深入解析C++中多态性和虚函数使用原理
    目录1.为什么需要virtual2.纯虚函数和抽象类3.构造函数与虚函数4.虚析构函数与纯虚析构函数5.纯虚析构函数的应用1.为什么需要virtual 按照Java的思维方式,在有了...
    99+
    2023-05-20
    C++ 多态性虚函数 C++ 多态性 C++ 虚函数
  • 【C++】多态的实现及其底层原理
    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 文章目录 前言一、什么是多态?二、多态的构成条件2.1什么是虚函数?2.2虚函数的重...
    99+
    2023-08-17
    c++ 开发语言 多态
  • 关于C++虚函数与静态、动态绑定的问题
    覆盖:如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数,它们之间成为覆盖关系;...
    99+
    2024-04-02
  • 关于分布式锁(Redisson)的原理分析
    目录1、分布式锁场景1.1 案例11.2 案例2-使用synchronized 实现单机锁1.3 案例3-使用redis的SETNX实现分布式锁1.4 案例4-加入过期时间1.5 案...
    99+
    2024-04-02
  • java中多态原理的示例分析
    这篇文章将为大家详细讲解有关java中多态原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发...
    99+
    2023-06-14
  • 分析redis原理及实现方法
    小编给大家分享一下分析redis原理及实现方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1 什么是redisredis是nosql(也是个巨大的map) 单线程,但是可处理1秒10w的并发...
    99+
    2024-04-02
  • C++多态性的实现及常见问题分析
    C++多态性的实现及常见问题分析引言:多态性是面向对象编程语言的一个重要特性,在C++中也得到了广泛应用。多态性允许不同类型的对象以相同的方式进行处理,提高了代码的灵活性和可维护性。本文将介绍C++中多态性的实现方式,并分析常见的多态性问题...
    99+
    2023-10-22
    实现 C++关键词:多态性 常见问题分析
  • 关于二分法查找Java的实现及解析
    目录二分法查找概述递归实现递归实现代码循环实现代码(非递归)二分法查找(递归、循环)二分法查找 概述 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作