文档章节

C++:静态联编和动态联编

貉子
 貉子
发布于 2014/08/26 13:30
字数 895
阅读 12
收藏 0

联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编动态联编

静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型,C语言中,所有的联编都是静态联编,据我所知道的,任何一种编译器都支持静态联编(废话)。

动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果。C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了。下面将介绍一下多态。

多态:字面的含义是具有多种形式或形态。C++多态有两种形式,动态多态和静态多态;动态多态是指一般的多态,是通过类继承和虚函数机制实现的多态;静态多态是通过模板来实现,因为这种多态实在编译时而非运行时,所以称为静态多态。

// 动态多态例子:

#include <stdio.h>
#include <iostream>

/** 
*Shape
*/
class CShape
{
public:
 CShape(){}
 virtual ~CShape(){}

 virtual void Draw() = 0;
};

/**
*Point
*/
class CPoint : public CShape
{
public:
 CPoint(){}
 ~CPoint(){}

 void Draw()
 {
  printf("Hello! I am Point!/n");
 }
};

/**
*Line
*/
class CLine : public CShape
{
public:
 CLine(){}
 ~CLine(){}

 void Draw()
 {
  printf("Hello! I am Line!/n");
 }
};


void main()
{
 CShape* shape = new CPoint();
 //draw point
 shape->Draw();//在这里shape将会调用CPoint的Draw()函数
 delete shape;

 shape = new CLine();
 //draw Line
 shape->Draw();//而在这里shape将会调用CLIne 的Draw()函数
 delete shape;

 return ;
}



由上面的例子,大家应该能理解什么是多态了:也就是一个Draw() 可以有两种实现,并且是在运行时决定的,在编译阶段不知道,也不可能知道!只有在运行的时候才能知道我们生成的shape是那种图形,当然要实现这种效果就需要动态联编了,在基类我们会把想要多态的函数声明为虚函数,而虚函数的实现原理就使用了动态联编。如果你想了解的更透彻,那就上网查查资料吧!呵呵!在这里我就不再啰嗦虚函数的实现原理了。

顺便在这里也提供一个静态多态的例子:

在上面例子的基础之上添加模板函数:

template <class T>
void DrawShape(T* t)
{
 t->Draw();
}

// 修改main函数为如下:

void main()
{
 CShape* shape = new CPoint();
 //draw point
 shape->Draw();

 DrawShape<CPoint>((CPoint*)shape);
 delete shape;

 shape = new CLine();
 //draw Line
 shape->Draw();
 DrawShape<CLine>((CLine*)shape);
 delete shape;

 
 return ;
}

在程序编译main函数的时候,编译器就已经指定了DrawShape函数里面的Draw要调用那个实现了,这就是静态多态,在编译时就已经知道了要调用的函数。

全文完!



本文转载自:http://blog.csdn.net/blucexi/article/details/1253265

貉子
粉丝 9
博文 94
码字总数 33240
作品 0
海淀
程序员
私信 提问
C++中 _declspec(novtable) 的探讨

(1)V TA B L E(虚函数表)和VPTR(指向虚函数标的指针)的区别 编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟。 编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。...

风刃
2018/06/26
0
0
运行MFC程序提示没有找到MFC42D.DLL文件的解决方法

运行MFC AppWizard(exe)程序,汇编成功,可是运行时,出现错误:“没有找到MFC42D.DLL,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题. ” 解决方案为:出现上述提示的原因是...

lcniuren33
2012/07/04
4.9K
0
C++学习笔记(12)——多态与虚函数

本博客( http://blog.csdn.net/livelylittlefish )贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! 多态与虚函数 1.多态性 多态的概念: l 在面向对象的概念中...

晨曦之光
2012/03/09
182
0
C++ Primer Plus(四)——复合类型

只能在定义数组时才能初始化,不能将一个数组赋值给另一个数组,但可以使用下标分别赋值给数组元素,但可以将一个string对象赋值给另一个string对象 如果只对数组的一部分初始化,其他元素自...

吃一堑消化不良
2015/11/06
118
0
NDK开发---C++学习(六):继承、多态

前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看 NDK开发---C++学习(三):类与函数(上) NDK开发---C++学习(四):类与函数(中) NDK开发---C++学习(五):类与函数(...

浮生若梦zp
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis + Ehcache 二级缓存实例

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕...

xiaolyuh
18分钟前
4
0
Spring源码学习(二)哎呦,按菜谱做菜与AbstractAutowireCapableBeanFactory.createBean流程差不多

记得跟老婆谈恋爱时,有一天心血来潮给老婆做饭,按照菜谱一步一步的做,结果差点把厨房烧了!!! 这事至今老婆还记得。 入口 上一篇说了,AbstractBeanFactory.getBean的主流程 ,今天来说下...

温安适
21分钟前
34
0
前端UI攻城狮 你们该抛弃jQuery了

你不再需要jQuery! Web工程师太依赖jQuery了,某种意义上说jQuery已经成了JavaScript的同义词。但是我们真的需要他么?或许我们应该反思一下什么时候才真的需要jQuery。 对我个人而言开始使...

前端老手
22分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
今天
6
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部