C++中的动态连编和静态连编
1. 什么是连编?
- 将一个调用函数连接上正确的被调用函数,这个过程就叫做函数的联编,简称联编。
2. 在C++中存在如下两种联编的方式:
- 静态联编
- 定义:静态联编是指联编工作出现在编译连接阶段。
- 特点:① 静态联编就是指被调用函数和执行调用函数之间的关系以及它们在内存中的地址在编译的时候已经确定好了,运行时不会发生变化。②由于对象不用对自身进行跟踪,因此速度浪费比较小,但是灵活性较差。
- 动态联编
- 定义:动态联编是指在程序运行的时候才进行的联编工作。
- 特点:① 由于编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数。要确切之道该调用的函数,就必须要求联编工作在程序运行时才能进行。 ② 虽然可以追踪对象,灵活性较强,但是速度浪费严重。
3. 在C++中,出现多态有三个条件:
- 继承
- virtual关键字修饰
- 父类指针或者引用指向子类对象
virtual关键字的作用是,告诉编译器,我这个函数是用来支持多态的虚函数,你不要在编译期间就确定怎么来调用我,而是要在运行的时候,根据对象的实际类型,去判断如何调用.
4. 重载与重写
- 重载:
- 函数在同一作用域里
- 函数名相同/参数不同
- 返回值可以不同
- 重写(覆盖)
- 函数不在同一作用域里(两个函数分别在父类和子类里)
- 函数名相同/参数列表相同/返回值相同(协变除外)
- 基类函数必须是虚函数(有关键字virtual)
- 访问修饰符可以不同
5. 子类新增加方法和父类有啥关系?
- 子类新增的方法,子类自己可以访问,但是通过父类的引用,指向子类的对象,或者父类的指针,指向子类的对象,都不可以访问….
6. 怎么解释,编译看父类,运行看子类?
个人的理解就是,我们用父类的引用接收他的子类的对象的时候,我们当前的这个引用的功能是比较强大的,n多个子类对象重写这个方法,这个方法就有n多个功能
过程:
- 编译一开始看看自己有没有这个方法.如果是普通的函数,而不是虚函数,编译的时候就知道了要调用 方法,就是这个方法,(静态连编)…
- 如果是虚函数,查看子类有没有重写他的方法,没有的话,调用自己的方法,如果子类重写了,调用的是子类的方法;(动态连编)…
- 他可能不止有一个子类,假设有很多个子类,都重写的他的方法,那么具体调用的是这个引用指向的那个子类的方法…
7. C++的示例代码如下…如下代码,可以增强对多态的理解
1 |
|