首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++多态总结(静态&动态)

[nm7jnxkrzp.png] 静态多态 我们以前说过函数重载就是一个简单静态多态,静态多态是编译器在编译期间完成,编译器会根据实参类型来选择调用合适函数,如果有合适函数可以调用就调,没有的话就会发出警告或者报错...动态多态 动态多态:它是在程序运行时根据引用(指针)指向对象来确定自己具体该调用哪一个虚函数。 中必须包含虚函数,并且派生中一定要对虚函数进行重写。 ...通过对象指针或者引用调用虚函数,因为派生虚函数进行重写,使用派生虚函数替换相同偏移量位置虚函数,如果派生中新增加自己虚函数,按照其在派生声明次序,放在上述虚函数之后...重写 :  (a)中将被重写函数必须为虚函数(上面的检测用例已经证实过了)  (b)派生中虚函数原型必须保持一致(返回类型,函数名称以及参数列表),协变和析构函数(派生析构函数是不一样...协变:(或者派生虚函数返回派生指针(引用)  总结一道面试题:那些函数不能定义为虚函数?

74030

C++进阶:详解多态(多态、虚函数、抽象以及虚函数原理详解)

通过指针或引用调用虚函数时,将根据对象实际类型调用相应派生函数 从上面这段话我们知道在继承中要构成多态还有两个条件: 必须通过指针或者引用调用虚函数 被调用函数必须是虚函数...在进行函数重写时,子类中虚函数返回类型、函数名、参数列表必须与虚函数完全相同 注意:在重写虚函数时,派生虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后虚函数被继承后在派生依旧保持虚函数属性...2.2.3虚函数重写两个例外 协变(派生虚函数返回类型不同) 派生重写虚函数时,与虚函数返回类型不同。...所以如果不实现多态,不要把函数定义成虚函数 普通函数继承(实现继承): 在普通函数继承中,派生继承了函数具体实现。 派生可以直接使用函数,而不需要重新实现该函数。...,也称为静态多态, 比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,也称为动态多态。

41010
您找到你想要的搜索结果了吗?
是的
没有找到

多态性_dna多态性四个类型

虚方法: 如果中定义了一个方法成员,我们希望在派生继承该方法同时改变该方法具体实现,则需要该方法成员定义为虚方法,然后在通过派生重写同名方法成员...中使用关键字virtual将方法成员定义为虚方法,派生中使用voerride关键词重写虚方法,派生中对应方法成员方法名,返回类型,参数个数和类型必须完全相同。...重载是在同一个内部定义多个同名方法,这些同名方法参数列表必须互不相同(参数个数或类型不同)返回类型可以相同,也可以不同,在用户调用该方法时,系统能够根据参数不同自动识别应调用方法。...多态则是在派生中定义一个和中一样名字非虚方法,会让同名方法被隐藏。...中定义虚方法在派生中只能被重写一次,中使用关键词virtual将方法成员定义虚方法,派生主公使用override关键词重写虚方法,派生中对应方法成员方法名,返回类型,参数个数和类型必须完全相同

51640

设计模式之二(简单工厂模式)

前言   简单工厂模式根据提供数据或者参数返回几个可能一个实例,说通俗点有点像面向对象编程中多态性,一个,有多个派生,在另外调用程序中,根据参数来决定返回这个哪个具体派生,...返回值为类型,因为引用可以指向派生对象,而且这些所有的派生都包含有函数,也就是说派生中有相同函数,但是函数实现可能不同。...简单工厂模式   假定A是一个,AB和AC都是派生于A派生,XFactory根据提供给它参数来决定返回AB或者AC 哪一个,返回是哪个实例对于编程者来说并不是那么重要,因为这些有着相同方法...,编程者需要就是通过引用直接调用方法,不用去关心到底返回是哪个派生,因为这些有相同方法,只是实现不同而已。...如何决定返回哪一个派生,取决于工厂设计,该方法可以是非常复杂函数,也可以是简单函数。 接下来我们就通过简单加减乘除计算器来了解和实现简单工厂模式。

31410

C++中多态

那么在继承中,需要以下条件才能构成多态: ①被调用函数必须是虚函数,且派生必须对虚函数进行重写/覆盖。 ②必须通过指针或引用调用虚函数。...派生中有一个跟完全相同虚函数(即派生虚函数与虚函数返回类型、函数名字、参数列表完全相同,以下简称三同),称子类虚函数重写了虚函数。...协变(派生虚函数返回类型不同) 三同中,返回值可以不同,但是要求返回值必须是一个父子类关系指针或者引用。...②动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,即上面所说,会先到虚表中找具体函数地址,再去调用。动态绑定也称为动态多态。...其次,指针或引用派生对象时候,在切片后,指向派生对象中属于成员那一部分,但总体来说依然是指向派生,当需要调用重写虚函数时候,就会去成员那一部分中找接口,再去派生中找定义

81920

【C++进阶】多态理解

例如:函数重载和模板;         2.动态绑定,也称为动态多态,是在程序运行阶段确定根据具体拿到类型确定程序               具体行为,调用具体函数。...例外:              a.派生可以不加 virtual  ,因为派生已经继承了 virtual;              b.协变(虚函数返回对象指针或者引用,派生虚函数返回派生对象...重载,重定义(隐藏)与重写 重载:在同一作用域,函数名相同,返回值可以不同,参数列表必须不同; 重定义(隐藏):在不同作用域,一个在,一个在派生,只要函数名相同就构成重定义; 重写:1.在不同作用域...,一个在,一个在派生;            2.都必须是虚函数;            3.满足三同(函数名,返回值,参数列表相同(协变除外)); 总结 1.重写比重定义条件更加严苛; 2.两个派生同名函数...b.如果派生重写了中某个虚函数,用派生自己虚函数覆盖虚表中虚函                       数;                   c.派生自己新增加虚函数按其在派生声明次序增加到派生虚表最后

11010

设计模式之二(简单工厂模式)

前言   简单工厂模式根据提供数据或者参数返回几个可能一个实例,说通俗点有点像面向对象编程中多态性,一个,有多个派生,在另外调用程序中,根据参数来决定返回这个哪个具体派生,...返回值为类型,因为引用可以指向派生对象,而且这些所有的派生都包含有函数,也就是说派生中有相同函数,但是函数实现可能不同。...简单工厂模式   假定A是一个,AB和AC都是派生于A派生,XFactory根据提供给它参数来决定返回AB或者AC 哪一个,返回是哪个实例对于编程者来说并不是那么重要,因为这些有着相同方法...,编程者需要就是通过引用直接调用方法,不用去关心到底返回是哪个派生,因为这些有相同方法,只是实现不同而已。...如何决定返回哪一个派生,取决于工厂设计,该方法可以是非常复杂函数,也可以是简单函数。 接下来我们就通过简单加减乘除计算器来了解和实现简单工厂模式。

40830

封装、继承、多态、重载:C++中强大特性与代码设计

被称为或者父,新被称为派生或者子类。 多态 C++中多态是面向对象编程一个重要概念,它允许使用指针或引用来处理不同类型对象,而实际上执行根据对象类型动态选择相关操作。...dynamic_cast用于将指针或引用转换为派生指针或引用,如果转换成功,返回指向派生指针或引用;如果转换失败,则返回空指针或抛出bad_cast异常。...多态性使得我们可以以一种统一方式来处理不同类型对象,而不需要关心对象具体类型。这样可以使代码更具灵活性和可维护性,同时提供了一种机制来实现运行时动态行为。...派生中必须实现纯虚函数,否则被看做一个抽象 对于一个没有任何接口,如果想要将它定义成抽象,只能将虚构函数声明为纯虚 通常情况下在中纯虚函数不需要实现,例外是纯析构函数要给出实现...返回类型不同不足以实现函数重载:函数返回类型不能作为重载函数区分标准,因为函数调用时通常会忽略返回值。

21510

连载 Python OOP指南(1)

注意:在继承关系中: 从另一个继承称为派生,子类或子类型派生其他称为或超派生据说可以派生,继承或扩展。...BaseException是为所有错误类型提供。若要创建新错误类型,您必须从BaseException或从其派生派生。...该示例将演示继承使用以及派生如何提供基本类接口具体实现。 人力资源系统需要处理公司员工薪资,但是根据员工薪资计算方式,员工类型有所不同。...最好依靠中已经实现方法并根据需要扩展功能。 您为系统创建了一流层次结构。这些UML图如下所示: ? 该图显示了继承层次结构。...派生必须重写该方法,以允许创建其类型对象。 实现继承与接口继承 当您从另一个派生一个时,派生将继承这两个接口:派生继承所有方法,属性和属性。

79010

【C++】多态

虚函数重写(覆盖):派生中有一个跟完全相同虚函数(即派生虚函数与虚函数 返回类型、函数名字、参数列表完全相同),称子类虚函数重写了虚函数。...要注意是虚函数重写有两个意外: 1. 协变(派生虚函数返回类型不同) 派生重写虚函数时,与虚函数返回类型不同。...即虚函数返回对象指 针或者引用,派生虚函数返回派生对象指针或者引用时,称为协变。...注意:如果一个派生虚函数需要调用它版本,但是没有使用作用域运算符,则在运行时该调用将被解析为对派生版本自身调用,从而导致无限递归。...动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体 行为,调用具体函数,也称为动态多态。

11810

什么是多态?如何实现?只看这一篇就够了

2.3虚函数重写 虚函数重写(覆盖):派生中有一个跟完全相同虚函数(即派生虚函数与虚函数返回类型、函数名字、参数列表完全相同),称子类虚函数重写了虚函数。...: 协变(派生虚函数返回类型不同)派生重写虚函数时,与虚函数返回类型不同。...即虚函数返回对象指针或者引用,派生虚函数返回派生对象指针或者引用时,称为协变。...总结一下派生虚表生成: a.先将虚表内容拷贝一份到派生虚表中 b.如果派生重写了中某个虚函数,用派生自己虚函数覆盖虚表中虚函数 c.派生自己新增加虚函数按其在派生声明次序增加到派生虚表最后...4.3 动态绑定与静态绑定 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序行为,也称为静态多态,比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为

1.3K10

派生多态虚函数?

成员函数与继承派生可以继承其成员, 然而有时候派生必须对其重新定义。派生需要对这些操作提供自己新定义以覆盖从继承而来旧定义。...根据引用或指针所绑定对象类型不同,该调用可能执行版本,也可能执行某个派生版木,通过在其成员函数声明语句之前加上关键字virtual使得该函数执行动态绑定。...此外,我们能将公有派生类型对象绑定到引用或指针上。 大多数都只继承自一个,这种形式继承被称作“单继承”。 派生虚函数派生类经常(但不总是)覆盖它继承虚函数。...晚绑定-》运行阶段确定函数地址 动态多态满足关系: 1.有继承关系 2.子类重写父虚函数 动态多态使用:父指针或引用 指向子类对象 重写:函数返回类型 函数名 参数列表 完全一致叫重写...1.虚析构与纯虚析构共性: 解决父指针释放子类对象不干净问题 都需要具体函数实现 2.区别: 如果是纯虚析构,该类属于抽象,无法实例化 .虚析构语法: virtual ~名(){}

14720

【笔记】《C++Primer》—— 第三部分:设计者工具

每次继承一个就会在内存中生成一个子对象,存放了成员,也正是因为这个原因派生可以转换为 派生构造函数需要负责所有成员初始化,尽管派生也可以初始化继承来成员,但是这不符合通常编码思路...虚函数返回类型需要一致,除非虚函数返回类型本身引用或指针时为了多态性会有特例 如果想要保证中某个虚函数一定会被覆盖,则可以在想要用来覆盖函数后面加上override关键字 函数后面加上...using声明需要改变名称(用::作用域符特指名称) 派生转换也与派生列表访问说明符有关,本质上与类型转换函数权限有关 名称查找是根据编译时目标的静态类型从内到外进行查找,目标的静态类型决定了其是否可见...模板不会推断参数类型 模板成员函数只有在使用时才会实例化 模板与另一个模板直接最常见友元是一对一友元,首先模板需要声明所有需要用到名字,然后在声明友元时标注出目标具体模板实参 模板也可以一对多友元...,我们可以用尾置返回来完成这个目标: 标准库头文件type_traits中来进行特殊类型转换能够动态地将这些语言特性消去从传入参数中提取出我们想要类型 编译器是从模板函数调用中推断具体实参类型要求在

1.7K10

后台开发:核心技术与应用实践 -- C++

本书介绍“后台开发”指的是“服务端网络程序开发”,从功能上可以具体描述为:服务器收到客户端发来请求数据,解析请求数据后处理,最后返回结果。...面向对象C++ 对象是类型一个变量,则是对象模板,是抽象,不占用存储空间;而对象是具体,占用存储空间。...在派生时,派生是不能继承析构函数,也需要通过派生析构函数去调用析构函数。...在派生中可以根据需要定义自己析构函数,用来对派生中所增加成员进行清理工作;清理工作仍然由析构函数负责。...虚函数声明方式: virtual 返回类型 函数名(); 当把某个成员函数声明为虚函数后,就允许在其派生中对该函数重新定义,赋予它新功能,且可以通过指向指针指向同一族中不同类对象,从而调用其中同名函数

1.3K10

深入解析C++中虚函数和虚继承:实现多态性与继承关系高级特性

虚函数允许在运行时根据对象实际类型来调用相应函数,而不仅仅根据指针或引用类型。...这使得在继承关系中,通过指针或引用调用虚函数时,可以根据实际对象类型来动态地确定要执行函数版本,实现多态性特性。...在C++中,当指针或引用指向派生对象时,通过调用虚函数,可以实现对应于派生特定实现。这种根据对象实际类型来确定调用哪个函数机制就是动态绑定。...动态多态使用:父指针或引用 指向子类对象 重写:函数返回类型 函数名 参数列表 完全一致叫重写 如果子类中没有堆区数据,可以不用写虚析构和纯虚析构。...Derived继承自Base,并提供了对纯虚函数具体实现。通过Derived对象或指针可以调用纯虚函数具体实现。 纯虚函数允许在中定义一组接口,并强制要求派生提供相应实现。

94410

C++进阶-多态

virtual void BuyTicket() { cout << "买票-全价" << endl; } }; 虚函数重写: 派生中有一个跟完全相同虚函数(即派生虚函数与虚函数返回类型...协变 虚函数返回对象指针或者引用,派生虚函数返回派生对象指针或者引用时,称为协变(派生虚函数返回类型不同) 示例: class A {}; class B : public...一般情况这个数组最后面放了一个nullptr(用来表示结束)(可能根据编译器而定) 派生虚表生成总结: 先将虚表内容拷贝一份到派生虚表中 如果派生重写了中某个虚函数,...,也称为静态多态(如函数重载) 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,也称为动态多态 4、多继承虚函数表 注:我们想看多继承虚函数表是怎么样...可以,并且最好把析构函数定义成虚函数 当指针指向new出来对象或new出来派生对象时,需要使用指针进行释放对象,此时需要析构函数为虚函数,保证指针指向对象成功释放 对象访问普通函数快还是虚函数更快

56530

多态与虚(函数)表

就如:我们去买票,根据不同年龄给出不一样优惠,他们都是游客,不同年龄由游客派生出不同年龄游客,但是我们只有一个“卖票”这一个接口,那如何实现呢?...(覆盖):派生中有一个跟完全相同虚函数(即派生虚函数与虚函数 返回类型、函数名字、参数列表完全相同),称子类虚函数重写了虚函数. class Person { public:...协变(派生虚函数返回类型不同) 派生重写虚函数时,与虚函数返回类型不同。即虚函数返回对象指 针或者引用,派生虚函数返回派生对象指针或者引用时,称为协变。...总结一下派生虚表生成:a.先将虚表内容拷贝一份到派生虚表中 b.如果派生重写了中某个虚函数,用派生自己虚函数覆盖虚表中虚函数 c.派生自己新增加虚函数按其在派生声明次序增加到派生虚表最后...动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,也称为动态多态。 3.

56120

必知必会之C++多态机制

具体来说,多态性允许指针或引用在运行时指向派生对象,并且根据对象实际类型来调用相应成员函数。 多态性是通过虚函数来实现。...动态多态(运行时多态): 主要是通过虚函数和继承实现,例如,指针指向派生对象,并调用虚函数。在运行时,根据对象实际类型来决定调用哪个版本函数。这种多态性在运行时才会确定。...动态多态性通过虚函数和继承来实现,在编译时无法确定函数调用具体版本,而是在运行时根据对象类型动态确定。...动态多态实现需要满足以下两个条件: 中声明虚函数: 在中将函数声明为虚函数,这样编译器就会在运行时进行函数调用动态绑定。...派生重写虚函数: 派生中可以通过重写(覆盖)虚函数来提供自己实现。在调用这个虚函数时,会根据对象实际类型来决定调用哪个版本函数。

10310

【C++】多态——实现、重写、抽象、多态原理

BuyTicket() { cout << "普通人买票——全价" << endl; } 虚函数重写(覆盖):派生中有一个跟完全相同虚函数(即派生虚函数与虚函数返回类型、函数名字...即三同:返回类型、函数名、参数列表完全相同),称子类虚函数重写了虚函数。...),但是该种写法不是很规范,不建议这样使用: 2.协变(派生虚函数返回类型不同) 在三同中,返回值可以换不同,但是要求返回值必须是一个父子类关系指针或者引用 ---- 三、析构函数重写...重写(覆盖):两个函数分别在派生作用域,同时,函数名/参数/返回值都必须相同(协变除外),并且两个函数必须是虚函数!...静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序行为,也称为静态多态,比如:函数重载 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到类型确定程序具体行为,调用具体函数,

39030

领悟面向对象就离开发应用不远了(提高)有你对面向对象所有疑问,爆肝1w字

而必须通过方法进行访问,具体说就是派生构造函数必须使用构造函数,其他类比 RatedPlayer :: RatedPlayer(unsigned int r,const &fn,const...析构:首先调用派生析构函数,然后再调用析构函数 2.多态 ***公有 *** 继承 当需要同一个方法再派生中行为是不同,或者说方法行为应取决于调用该方法对象——多态,多种状态 在派生中重新定义...注意:如果在派生中重新定义方法,通常将方法声明为虚,好处是程序将根据对象类型而不是引用或者指针类型来选择方法版本,算是一个惯例吧 函数实现我就不写了,不然篇幅太长了,感谢!...这里“重写”要求是函数特征标(包括参数数目、类型和顺序)以及返回值都必须与函数一致。...中 可以在中将被重写成员函数设置为虚函数,其含义是:当通过指针或者引用调用该成员函数时,将根据指针指向对象类型确定调用函数,而非指针类型

50820
领券