解析动态联编(上篇)

文章摘要

多态性是C++最主要的特征,多态性的实现得益于C++中的动 态联编技术。文章通过对动态联编的关键技术虚拟函数表进行深入的剖析,解析 的动态联编的过程极其技术要领。

关键字

多态性 动态联编 VTABLE 虚函数

文章正文

一 从多态性谈动态联编的必要性

在进入主题之前先介绍一下联编的概念。联编就是将模块或者函数合并在一起生 成可 执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对 外部访问也分配正确的内存地址。按照联编所进行的阶段不同,可分为两种不同 的联编方法:静态联编和动态联编。在编译阶段就将函数实现和函数调用关联起 来称之为静态联编,静态联编在编译阶段就必须了解所有的函数或模块执行所需 要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型。反 之在程序执行的时候才进行这种关联称之为动态联编,动态联编对成员函数的选 择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编 译结果。C语言中,所有的联编都是静态联编。C++中一般情况下联编也是静态联 编,但是一旦涉及到多态性和虚函数就必须使用动态联编。

多态性是面向 对象的核心,它的最主要的思想就是可以采用多种形式的能力,通过一个用户名 字或者用户接口完成不同的实现。通常多态性被简单的描述为"一个接口, 多个实现。在C++里面具体的表现为通过基类指针访问派生类的函数和方法。

下面我们看一个静态联编的例子,这种静态联编导致了我们不希望的结果 。

//1.cpp
1.#include <iostream.h>
2.class shape{
3.public:
4.void draw(){cout<<"I am shape"<<endl;}
5.void fun(){draw();}
6.};
7.class circle:public shape{
8.public:
9.void draw() {cout<<"I am circle"<<endl;}
10.};
11.main(){
12.class circle oneshape;
13.oneshape.fun();
14.}

时间: 2024-09-15 03:49:35

解析动态联编(上篇)的相关文章

解析动态联编(下篇)

三 虚函数表VTABLE 动态联编过程跟我们猜测的大致相同.编译器在执 行过程中遇到virtual关键字的时候,将自动安装动态联编需要的机制,首先为这 些包含virtual函数的类(注意不是类的实例)--即使是祖先类包含虚函数而本身 没有--建立一张虚拟函数表VTABLE.在这些虚拟函数表中,编译器将依次按照函 数声明次序放置类的特定虚函数的地址.同时在每个带有虚函数的类中放置一个 称之为vpointer的指针,简称vptr,这个指针指向这个类的VTABLE. 关于 虚拟函数表,有几点必须声明清

C++中静态联编和动态联编介绍

联编是指一个计算机程序自身彼此关联的过程.按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编. 静态联编 静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程序开始运行之前完成的. 在编译时所进行的这种联编又称静态束定.在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定.下面举一个静态联编的例子. #include class Point{public:Point(double i, do

C++中的虚函数和动态联编

  面向对象程序设计的基本观点是用程式来仿真大千世界,这使得它的各种根本特性非常人性化,如封装.继承.多态等等,而虚函数就是c++中实现多态性的主将.为了实现多态性,c++编译器也革命性地提供了动态联编(或叫晚捆绑)这一特征. 虚拟函数亦是mfc编程的关键所在,mfc编程主要有两种方法:一是响应各种消息,进行对应的消息处理.二就是重载并改写虚拟函数,来实现自己的某些要求或改变系统的某些默认处理. 虚函数的地位是如此的重要,对它进行穷根究底,力求能知其然并知其所以然 对我们编程能力的提高大有好处.

(一三九)静态联编和动态联编

决定程序调用时,将使用哪个可执行代码块,是由编译器负责的. 将源代码中的函数调用解释为执行特定的函数代码块被称为 函数名联编.   在C++语言中,这个过程比在C语言中更麻烦一些(因为C++存在函数重载,编译器要给函数重命名),编译器要查看函数参数及函数名才能确定使用哪个函数(根据匹配的优先级,一共4级).   C/C++编译器可以在编译过程中完成这种联编,在编译过程中进行联编被称为  静态联编(static binding),又称为早期联编(early binding).   然而虚函数使这项

C++的静态联编和动态联编_C 语言

最近在看析构函数的内容,看到一些讲的比较好的文章,这里我也有了一些我自己的体会,在这里一并记录一下. 联编是指一个计算机程序自身彼此关联的过程,在这个联编过程中,需要确定程序中的 操作调用(函数调用) 与 执行该操作(函数) 的代码段之间的映射关系. 意思就是这个函数的实现有多种,联编就是把调用和对应的实现进行映射的操作. 按照联编进行的阶段不同,可分为静态联编和动态联编. 静态联编 静态联编工作是在程序编译连接阶段进行的,这种联编又称为早期联编,因为这种联编实在 程序开始运行之前 完成的.在程

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

C++的静态联编和动态联编详解_C 语言

一.概述: 通常来说联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程.按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编. 静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型,C语言中,所有的联编都是静态联编,并且任何一种编译器

JavaWeb开发之使用jQuery与Ajax实现动态联级菜单效果_java

写在前面,在笔者完成这个demo的时候,笔者发现现在大家已经不用Ajax来完成联级菜单了,实际上笔者这个demo也并不是为了完成这个,笔者主要的学习方向是JavaWeb后台的业务逻辑开发.但是做后台呢还是需要对前端有所了解,尤其是像Ajax这种异步提交数据的技术需要了解并掌握.所以这里笔者这里用了一个联级菜单来练习Ajax异步提交,当然后续还会写几个异步提交表单的demo. 笔者的后台是用的spring+SpringMVC的框架,这里不对这部分进行解释,重点在jQuery和Ajax. 第一,下载

linux编程-ubuntu 14.04 glade 联编,什么情况?

问题描述 ubuntu 14.04 glade 联编,什么情况? 2问题,为什么出现?怎么解决呢? 以su - root方式登陆的超级用户,运行glade: Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The connection is closed (g-io-error-quark, 18) Error creating proxy: The conne