• 虚函数


    首先通过虚函数实现晚捆绑,这里面所有的工作是编译器完成的,编译器安装必要的晚捆绑机制。

    关键字virtual告诉编译器不应当现在早捆绑,而是安装一个晚捆绑必须的所有机制。

    通用的实现方法是,编译器为每个虚函数的类创建一个表,在这个表,编译器放置特定类的虚函数的地址。在每个带有虚函数的类中,编译器秘密地放置一个指针,成为vpointer,指向这个对象的虚函数表。

    当通过基类指针做函数调用时(多态调用时),编译器静态的插入能取得这个vpointer并在虚函数表找到函数地址的代码。这样就可以实现晚捆绑了。

     如上图所示,没有任何虚函数的类是成员变量的数据大小,有一个和多个虚函数的大小都增加了一个void*的大小。

     这是因为编译器发现有一个或者多个虚函数时,编译器就会在插入单个指针,这个指针指向的是这个类在虚函数表的起始地址。

    虚函数表的建立过程:

       每当创建一个包含虚函数的类或包含虚函数的类派生的一个类时,编译器就会为这个类创建一个唯一的VTABLE(虚函数表),在这个表中,编译器放置了这个类中或者它的基类中所有的声明为virtual的函数的地址

       相当于基类和自己类的虚函数都会放在里面,如果派生类没有重写基类的虚函数就会使用基类的地址。

  • 相关阅读:
    安装AD域时,出现NetBIOS名称冲突?
    SharePoint Server 2010 安装图解
    Visual C++ 2011519
    Visual C++ 2011520
    Visual C++ 2011518
    Visual C++ 2011520
    设计模式创建型 C++版本
    线程条件变量,一次性初始化
    Visual C++ 2011526
    Visual C++ 2011512
  • 原文地址:https://www.cnblogs.com/lingqingyu/p/13263191.html
Copyright © 2020-2023  润新知