C++多态学习笔记

来源:互联网 发布:网页在线客服软件 编辑:程序博客网 时间:2024/04/30 01:39

看了一堆介绍多态的东西,脑子里就记得几个概念了。静态多态,又叫早绑定,动态多态,应该是叫晚绑定。
多态的价值在于使程序更简洁、更高效。
no virtual no 多态,virtual means 已多态。

什么是多态?

不要觉得问题“很没用”,你还就是说不出来。同样的命令,不同的对象,做出不同的动作。这就得借助The King of Fighters来解释了。同样是“—>+B”的命令,草稚京发出来的是特殊技 外式轰斧阳,而里不知火舞发出来的是特殊技 黑燕之舞。哈哈,这就是多态。
当然这是复杂一点的多态,另一种多态是指:相同的对象,不同的命令,做出不同的动作。很好理解嘛,同一个拳皇98的人物,不同的按键方式发出的招式肯定不一样啊,要是都一样了,还玩个屁。

早绑定和晚绑定

都是雷人的概念。接着文章开篇说,早绑定和晚绑定的区别(个人理解)是从main函数的代码表现的,能只从main函数就判断出被调用部分的就是早绑定,不能判断出来的就称之为晚绑定(这样应该就可以理解我的另一篇博客了)。换个理解方式吧,同一类族的不同类的对象或其指针在程序中调用了同一个函数时,发生的就是晚绑定。而,简单的就是早绑定(简单在函数入口是固定的,进来的也只会是同一类人)!

动态多态必须以封装和继承为基础。所以,动态多态至少涉及两个类,基类和派生类。

换句话说,没有继承就没有多态。

静态绑定和动态绑定是需要“控制的”,虚函数的动态绑定难理解就在于控制细节被隐藏了,由编译器自动处理了。如果让你来设计这个控制过程你会如何设计呢?这就是下面虚函数表想解释的。

核心语法

多态的语法核心是virtual关键字,必须使用virtual才能使多个类间建立多态关系。
这里写图片描述

覆盖和隐藏

继承中,父类和子类有同名函数时就会有隐藏隐藏是在学习继承的时候就出现的概念。
覆盖虽然也是父类和子类之间的关系,但是仅指虚函数的“同名情况”。或者直观一点说,覆盖是特别针对虚函数父子的隐藏。

虚函数表(多态的原理)

基本认识:
有虚函数在内存中就有虚函数表;
大概有三个表,类的表—>虚函数表—>函数;
多态过程:
每个对象保存一份指向虚表的指针,当然还有对象的数据;
每个多态类型(就是每个类,即虚表按类分配而不是按对象,于是极大节省了内存空间)只有一个虚表;
虚表存函数入口地址。

最后补充一个多文件结构的知识和内存泄漏的wiki:
宏定义是为了避免.h文件的重复包含而写的(不过,我好想连什么是重复包含都不懂)。否则,编译会报错重定义。C++ 'class' type redefinition

.h文件中的宏定义

在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。

0 0