| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++动态多态的简单讨论 -> 正文阅读 |
|
[C++知识库]C++动态多态的简单讨论 |
目录一、基本约定
1.1 基类指针引用派生类对象?? 用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的。但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误2。如下例所示:
1.2 派生类指针引用基类对象?? 这种引用方式会导致语法错误,派生类指针必须先强制转换为基类指针,这种方法是不安全的。因此本文不再过多讨论。 二、动态多态?? 动态多态(动态绑定):即运行时的多态,在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。动态多态实现的关键是通过子类重写父类的虚函数实现的。需要有继承关系,并且在子类中重写父类中的虚函数。使用的关键是父类指针或引用指向子类对象3。 2.1 虚函数2.1.1 虚函数的定义及使用
?? 简单来说父类指针或引用指向子类对象,并调用父、子类中的同名函数时,到底会执行哪个函数是问题的关键,如下例:
?? 调用函数 function() 被编译器设置为父类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 function() 函数在程序编译期间就已经设置好了。
?? 此时,编译器看的是指针的内容,而不是它的类型。子类拥有自己的函数function() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。 2.1.2 同名函数但参数不同时的调用情况?? 同样用父类指针或引用指向子类对象,并调用基、子类中的同名函数时,但此时我们稍作一个修改,将基类和子类中的函数参数表现的有所差异。
?? 其结果如下,可以更为明显的看出调用函数 function() 被编译器设置为父类中的版本。 2.2 实例化对象调用同名函数2.2.1 实例化对象调用同名函数?? 若此时不用父类指针或引用指向子类对象,而是各自生成实例化对象,来调用同名函数。
?? 其结果如下,可以看出实例化对象调用的都是其自身的函数,其原理也是显而易见。 2.2.2 各自指针调用同名函数?? 进一步说,若通过各自的指针调用同名函数时,到底会执行哪个函数,如下例:
?? 其结果如下,可以看出调用的也都是其自身的函数。 三、纯虚函数?? 在对接口进行定义进行抽象类编写时,在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。纯虚函数的声明格式如下:
?? 例如:
?? 当然带有参数的纯虚函数声明也是合法的,例如:
四、小结?? 对C++动态多态的进行了简单的讨论。通过基本约定,明确了只能基类指针引用派生类对象。对动态多态的定义进行了描述。说明了虚函数的定义及基本使用方法。并进一步对同名函数但参数不同时的调用情况、实例化对象调用同名函数情况、各自指针调用同名函数情况,三种情况进行了简单讨论。 五、参考文献[1] 侯捷.深入浅出MFC[M].武汉:华中科技大学出版社,2001:53.
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:19:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |