c++晚捆绑的实现机制

 早绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。

晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。

   早绑定的优点是:
          (1)  编译效率 高
          (2)  有代码提示
          (3)  编译时类型检查 
   晚绑定的优点是:
          (1)  不用申明类型 
          (2)  对象类型可以随时更改

virtual关键字可以告诉编译器实行的是晚捆绑(虚函数)。

为了实现晚捆绑,典型的编译器对每个包含虚函数的类将创建一个表(VTABLE),在VTABLE中放着特定类的虚函数地址。在每个带有虚函数的类中,编译器会放置一个指针VPTR,指向这个对象的VTABLE。当通过基类指针做虚函数调用时,编译器静态的插入能取得这个VPTR并在VTAVLE表中查找函数地址的代码,这样就会引起晚捆绑的发生。

#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class NoVirtual
{
public:
void fun()
{}
int ret()
{}
private:
int a;
};
class OneVirtual
{
public:
virtual void fun()
{}
int ret()
{}
private:
int a;
};
class TwoVirtual
{
public:
virtual void fun()
{}
virtual int ret()
{}
private:
int a;
};
void test()
{
cout << "sizeof(int):" << sizeof(int) << endl;
cout << "sizeof(NoVirtual):" << sizeof(NoVirtual) << endl;
cout << "sizeof(OneVirtual):" << sizeof(OneVirtual) << endl;
cout << "sizeof(TwoVirtual):" << sizeof(TwoVirtual) << endl;
}
int main()
{
test();
system("pause");
return 0;
}

由于类Onevirtual和类Twovirtual的大小没有发生改变,所以可以推出上述的结论。

时间: 2025-01-01 11:14:39

c++晚捆绑的实现机制的相关文章

一种文件捆绑型病毒研究

一种文件捆绑型病毒研究宁 轲(广西职业技术学院 广西 南宁 530226) 摘 要: 文件捆绑型计算机病毒具有隐蔽性高.传播速度快和破坏力强等特点,早些年出现的威金病毒和熊猫烧香病毒都属于文件捆绑型病毒.本文对文件捆绑型病毒的其中一种模式做了技术上的分析和研究,最后给出了一些识别和防范此类病毒的方法.     关键词: 计算机病毒:文件捆绑:传播机制     中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2013)0110227-01 文件捆绑型病毒简单说就是病毒感染了其它文

c++编程思想(一)--对象导言

回过头来看c++编程思想第一章,虽然只是对c++知识的一个总结,并没有实质性知识点,但是收获还是蛮多的! 下面感觉是让自己茅塞顿开的说法,虽然含义并不是很准确,但是很形象(自己的语言): 1.类描述了一组具有相同特性(数据元素)和相同行为(功能)的对象,本质就是一个数据类型,已存在的数据类型只是表示计算机的存储单位,定义新的类就是为了与问题结合,解决问题-----不要把类想的很复杂,直接抽象成这样 2.类要产生工作,会有一个接口,来实现功能 3.程序猿分为类创建者和客户程序猿(调用别人的类).客

OO的片段

摘自C++编程思想: ------------------------------ 继承与组合:接口的重用 ------------------------------- 继承和组合都允许由已存在的类型创建新类型,两者都是在新类型中嵌入已存在的类型的子对象.然而,当我们想重用原类型作为新类型的内部实现的话,我们最好用组合,如果我们不仅想重用这个内部实现而且还想重用原来接口的话那就用继承.如果派生类有基类的接口,它就能向上映射到这个基类,这一点对多态性很重要. 虽然通过组合和继承进行代码重用对于快

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g

c++ virturn function -- 虚函数

pure irtual function  -- 纯虚函数 先看例子 #include <iostream> using namespace std; class Polygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } virtual int area() = 0 ;//{return 0;} // _vptr.Polygon show difre

《C++编程思想》 第十四章 多态和虚函数 (原书代码+习题+讲解)

一.相关知识点 函数调用捆绑 把函数体与函数调用相联系称为捆绑(binding).当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑.我们可能没有听到过这个术语,因为在过程语言中是不会有的:C编译只有一种函数调用,就是早捆绑.上面程序中的问题是早捆绑引起的,因为编译器在只有 instrument地址时它不知道正确的调用函数.解决方法被称为晚捆绑,这意味着捆绑在运行时发生,基于对象的类型.晚捆绑又称为动态捆绑或运行时捆绑.当一个语言实现晚捆绑时,必须有一种机制在运行时确定对象的类型和合适的

从汇编看c++中的多态

在c++中,当一个类含有虚函数的时候,类就具有了多态性.构造函数的一项重要功能就是初始化vptr指针,这是保证多态性的关键步骤. 构造函数初始化vptr指针 下面是c++源码: class X { private: int i; public: X(int ii) { i = ii; } virtual void set(int ii) {//虚函数 i = ii; } }; int main() { X x(1); } 下面是对应的main函数汇编码: _main PROC ; 16 : in

C++中虚函数工作原理和(虚)继承类…

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一.虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl.当

C++编程思想重点笔记(下)

上篇请看:C++编程思想重点笔记(上) 宏的好处与坏处 宏的好处:#与##的使用 三个有用的特征:字符串定义.字符串串联和标志粘贴. 字符串定义的完成是用#指示,它容许设一个标识符并把它转化为字符串,然而字符串串联发生在当两个相邻的字符串没有分隔符时,在这种情况下字符串组合在一起.在写调试代码时,这两个特征是非常有效的. #define DEBUG(X) cout<<#X " = " << X << endl 上面的这个定义可以打印任何变量的值. 我