动态联编和静态联编
一、静态联编
- 定义
在编译时所进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系。 - 注意:
静态联编由可访问属性和默认值确定
二、动态联编
- 定义
编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。动态联编又称动态关联。 - 组成
(1)成员函数必须声明为virtual
(2)如果基类中声明了为虚函数,则派生类中不必再声明。 - 调用方式
通过对象的指针或引用调用成员函数;或通过成员函数调用,反之就无法实现动态联编。
如下代码:
运行结果如下:
原因:
首先,创建base对象时,先创建base中的隐藏父对象Object,op指针是Object类型的指针,op->fun()时,静态联编,确定可访问属性(public),编译可以通过,默认值为10,在我们运行程序调动的时候,是动态联编,通过查询base中的虚表指针(指向base的虚表),动态调用base中的fun函数,但默认值为10,不是20.所以把10给了a。