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

多态性 - C++中实现运行时多态的方式

一、概述 C++中的多态性是指同一个函数可以有多种不同的实现方式,并且在运行时根据实际情况进行选择执行。在C++中实现多态有两种方式:静态多态和动态多态。...静态多态是指在编译时确定函数的实现,包括函数重载和模板函数;动态多态是指在运行时根据对象的实际类型来确定函数的实现,包括虚函数和抽象类。...在C++中,只要将函数声明为虚函数即可实现动态多态。...在调用函数`calculateArea`时,我们将基类指针指向派生类对象,可以看到运行时实际调用的是派生类的实现函数。 四、总结 本文介绍了C++中实现运行时多态的两种方式:静态多态和动态多态。...静态多态包括函数重载和模板函数,动态多态包括虚函数和抽象类。通过对这些知识点的学习,可以更好地理解C++中的多态性,更灵活地应用在实际的程序开发中

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

编译时多态运行时多态

参考链接: Java中的运行时多态 多态分为两种情况:编译时多态运行时多态。 如果在编译时能够确定执行多态方法称为编译时多态,否则称为运行时多态。  一、编译时多态  方法重载都是编译时多态。...方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。 例如,以下声明p、m引用本类实例,调用toString()方法是编译时多态。 ...Person{     public String toString(){         String name = "Man";         return name;     } } 二、运行时多态...  1.当以下父类对象p引用子类实例时,p.toString执行谁的setName()方法  Person p = new Man();    p.toString(); Java支持运行时多态,意为p.toString...()实际执行p所引用实例的toString(),究竟执行Person类还是Man类的方法,运行时再确定。

49500

Java 编译时多态运行时多态

根据何时确定执行多态方法中的哪一个,多态分为两种情况:编译时多态运行时多态。如果在编译时能够确定执行多态方法 中的哪一个,称为编译时多态,否则称为运行时多态。...方法覆盖表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。例如,以下声明p、m引用本类实例,调用toString()方法是编译时多态。...class Man extends Person{ public String toString(){ String name = "Man"; return name; } } 二、运行时多态...Person p = new Man(); p.toString(); Java支持运行时多态,意为p.toString()实际执行p所引用实例的toString(),究竟执行Person...类还是Man类的方法,运行时再确定。

54720

程序运行时C语言

1026 程序运行时间 (15 分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间...于是为了获得一个函数 f 的运行时间,我们只要在调用 f 之前先调用 clock(),获得一个时钟打点数 C1;在 f 执行完成后再调用 clock(),获得另一个时钟打点数 C2;两次获得的时钟打点数之差...(C2-C1) 就是 f 运行所消耗的时钟打点数,再除以常数 CLK_TCK,就得到了以秒为单位的运行时间。...输入格式: 输入在一行中顺序给出 2 个整数 C1 和 C2。注意两次获得的时钟打点数肯定不相同,即 C1 < C2,并且取值在 [0,10^7]。 输出格式: 在一行中输出被测函数运行的时间。...运行时间必须按照 hh:mm:ss(即2位的 时:分:秒)格式输出;不足 1 秒的时间四舍五入到秒。

35820

C++多态

C++多态 多态的概念 多态的定义与实现 多态的构成条件与虚函数 虚函数的重写 C++11 override 和 final 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 多态原理 虚函数表 原理与动静态绑定...多态的定义与实现 多态的构成条件与虚函数 多态很重要的前提就是先继承。 并且要去用基类的指针或者是引用去调用虚函数 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。...,不会走B和C类的A类初始化,因为A是B和C共享的,B和C去初始化都不合适,所以A只被D初始化了一次。...new D("class A", "class B", "class C", "class D"); delete p; return 0; } 继承与多态的常见问题 1.什么是多态?...如果是指针对象或者是引用对象,则调用的普通函数快,因为构成多态运行时调用虚函数需要到虚函数表中去查找。 7.虚函数表是在什么阶段生成的,存在哪的?

23990

C++】多态

引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。...因为我们直到运行时才能知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义。通常情况下,如果我们不使用某个函数,则无须为该函数提供定义。...对虚函数的调用可能在运行时才被解析 当某个虚函数通过指针或引用调用时,编译器产生的代码直到运行时才能确定应该调用哪个版本的函数。被调用的函数是与绑定到指针或引用上的对象的动态类型相匹配的那一个。...2.5C++11 override 和 final 从上面可以看出, C++ 对函数重写的要求比较严格,但是有些情况下由于疏忽,可能会导致函数 名字母次序写反而无法构成重载,而这种错误在编译期间是不会报出的...,只有在程序运行时没有 得到预期结果才来 debug 会得不偿失,因此: C++11 提供了 override 和 final 两个关键字,可以帮 助用户检测是否重写。

10710

C++【多态

,而另一个是解决菱形继承的问题 同样的,假设不是父类指针或引用进行调用,不会构成多态,也不会发生重写(覆盖)行为 2.3、final 与 override 在 C++11 中,新增了两个多态相关的关键字...,在编译阶段就确定了不同函数的调用;而动态绑定是虚函数的调用过程,需要 虚表指针+虚表,在程序运行时,根据不同的对象调用不同的函数 ---- 5、单继承与多继承中的虚表 5.1、单继承中的虚表 单继承中的虚表比较简单...,是因为调用方式不同,后继承类中的虚表需要通过 this 指针修正的方式调用虚函数 5.3、菱形继承多态与菱形虚拟继承多态(了解) 菱形继承问题是 C++ 多继承中的大坑,为了解决菱形继承问题,提出了...= p3 答案: A A D A C 6.2、综合问答(简答) 1.什么是多态多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。...没有实现多态时,两者一样快 实现多态后,普通函数速度快,因为虚函数还需要去虚表中调用 ---- 总结 以上就是本次关于 C++【多态】的全部内容了,在本篇文章中,我们重点介绍了多态的相关知识,如什么是多态

10730

C++多态

概念认知 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。...多态性在Object Pascal和C++中都是通过虚函数实现的。 --百度百科 由以上解释大致可以了解到多态的含义。对于C++来说,多态就是同一个函数不同的执行效果。...基本语法 C++支持多种多态,从实现形式上概括,有虚函数、重载等。从绑定时间,分为静态多态和动态多态,又称为编译期多态和运行期多态。...]) { cout << "字符串为: " << c << endl; } }; /* 重载实现多态 */ void print(int i) { cout << "整数为...归纳总结 主要介绍C++静态多态与动态多态的区别,结合实际的场景例子加深对多态的理解。

34810

C++】多态

动态绑定又称运行时绑定,它是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态;像多态调用这种,在运行时去指向的对象的虚表中取被调虚函数的地址,根据取得的地址来调用具体的虚函数的行为就是典型的动态绑定...我们上面讲解多态原理时给出的反汇编代码很好的解释了什么是编译时绑定和运行时绑定。...(一个在编译时就确定函数地址,后面运行时直接调用该地址;一个在运行时才去别处取函数的地址进行调用) 拓展思考:为什么父类对象不能实现多态,而必须是父类的指针/引用?...( ) A: 继承 B: 封装 C: 多态 D: 抽象 ( ) 是面向对象程序设计语言中的一种机制。...如果虚函数不是多态调用,则一样块;如果虚函数是多态调用,则普通函数访问更快,因为虚函数多态调用需要运行时到虚表中去取虚函数的地址,然后再 call。 虚函数表是在什么阶段生成的,存在哪的?

43500

C++多态

本章内容旨在解决以下几个问题: 什么是 C++ 多态C++ 多态的实现原理是什么 什么是虚函数,虚函数的实现原理是什么 什么是虚表,虚表的内存结构布局如何,虚表的第一项(或第二项)是什么 菱形继承(...size计算 什么是 C++ 多态C++ 多态的实现原理是什么 在 C++ 程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。...在C++中主要分为静态多态和动态多态两种,在程序运行前就完成联编的称为静态多态,主要通过函数重载和模板实现,动态多态在程序运行时才完成联编,主要通过虚函数实现。...对于一个继承体系来说,如果在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。...运行期多态就是通过虚函数和虚函数表实现的。一个含有虚函数的类中至少都有一个虚函数表指针,且有一个虚表,虚函数指针指向虚函数表。

1.7K10

C++】多态

多态调用编译时可确定不了函数的地址,因为无法根据调用者的类型确定函数地址,只能在运行时去当前指针所指对象的虚函数表里面找,找到对应的虚函数地址才可以进行调用。 3....//多态调用 -- 运行时绑定,动态绑定/决议 ptr = &b; 00206858 lea eax,[b] 0020685B mov dword ptr [ptr...动态绑定又称运行时决议或后期绑定,,晚绑定,即在程序编译期间无法确定程序行为,例如多态调用,这就是动态多态,只能在程序运行期间,去指针或引用指向的虚表里面去找对应的虚函数地址。...打印虚表这里对C语言指针的要求很高,我们可以通过类型转换(Derive *转成int *)发生截断,取到对象地址的头四个字节,这四个字节其实就是虚表指针变量,变量里面存放的是虚表指针,然后解引用这四个字节拿到虚表地址...D的继承顺序是先B后C,但B里面又会先继承A,所以实际初始化顺序是先A后B再C,在B中打印class A 之后也就初始过A了,C中就不会再初始化A,C中仅仅打印”class C“后就会结束,所以最终答案为

48920

C++多态

多态原理 当类存在虚函数时,编译器会为该类维护一个表,这个表就是虚函数表(vtbl),里面存放了该类虚函数的函数指针。在构造类的时候增加一个虚表指针(vptr)指向对应的虚函数表。...父类指针(引用)指向子类进行多态调用时候,编译器并不关系是子类还是父类,而是通过vptr指向的btbl来找到对应的函数指针,并调用函数。...Children " << x << endl; } }; int main() { Parent *parent = NULL; Parent p(1); Children c(...10); parent = &p; parent->print(); parent = &c; parent->print(); } 测试一运行结果,发现虽然父类指针或引用指向了子类...,但是在调用方法时候还是调用的父类的方法 Parent 1 Parent 10 测试二,对print方法加上virtual关键字,这时才体现出多态 Parent 1 Children 10

42730

C++基础-多态

多态(Polymorphism)是面向对象语言的一种特征,可能使用相似的方式(基类中的接口)处理不同类型的对象。...这种情况未启用多态机制 如果基类中的 Swim() 是虚函数,那么运行时会根据基类引用(或指针)指向的具体对象,调用对象所属的类中的方法。...这种情况使用了多态机制 使用基类指针或引用指向基类或派生类对象,运行时调用对象所属的类(具有继承层次关系的基类或派生类)中的方法,这就是多态。...C++ 就是通过虚函数表实现多态的。...而构造函数只能创建固定类型的对象,不具备多态性,因此 C++不允许使用虚复制构造函数。 虽然如此,但存在一种不错的解决方案,就是定义自己的克隆函数来实现上述目的。这部分内容有些复杂,待用到时再作补充。

82620

深入浅出OOP(三): 多态和继承(动态绑定运行时多态)

在前面的文章中,我们介绍了编译期多态、params关键字、实例化、base关键字等。本节我们来关注另外一种多态运行时多态运行时多态也叫迟绑定。...运行时多态或迟绑定、动态绑定 在C#语音中,运行时多态也叫方法重写(overriding),我们可以在子类中overriding基类的同签名函数,使用“virtual & override”关键字即可。...3个类的运行时多态 在ClassA\ClassB基础上,下面添加ClassC,看看3个类继承关系的运行时多态: /// /// ClassB, acting as a base...AAA ClassB BBB ClassA CCC ClassC AAA ClassA BBB ClassA CCC 如果基类声明了virtual 关键字,子类可使用override修饰符实现运行时多态...在这里,我们通过在B类中添加new Virtual修饰符,然后在C中即可使用B中Virtual的X函数了。 4个类的运行时多态 ? 在上面继承上,在运行时多态中添加第四个类:ClassD。

49380
领券