C ++ 对象模型

来源:互联网 发布:java web招聘网站源码 编辑:程序博客网 时间:2024/04/28 16:13

概述

C++ 是面向对象的程序设计,除了和 C 一样支持 程序模型,同时也支持 抽象数据类型模型 和 面向对象模型,由于这些引起了 C++ 的复杂性,下面对 C++ 对象进行简要的分析。

关于对象

  1. C 语言相关:程序性 —— 数据操作 分开;
  2. C++ 相关:抽象数据类型面向对象模型
    • 相对于程序性的设计,C++ 增加了布局和存取时间上的额外负担(该负担主要由 virtual 功能引起):
      • 用于支持一个有效“执行期绑定(runtime binding)”的virtual function 机制;
      • 用以实现“多次出现在继承体系中的 base class,有一个单一而被共享的实例”的virtual base class机制;
    • C++ 中 class 中的数据成员和成员函数:
      • data membersstatic data members 和 nonstatic data members;
      • member functionsstatic member functions、nonstatic member functions 和 virtual member functions;
    • 对象模型:
      • 简单对象模型:每个 object 是一系列的 slots,每个 slots 指向一个 member(包括 data members 和 member functions),相当于指针,member 本身并不保存在 object 对象中;
      • 表格驱动对象模型:每个 object 对象包含一个指向 data member table 和一个指向 member function table 的指针。data member table 保存的是 data 本身,而 member function table 保存的是一系列的指向 member function 的 slots;
      • C++ 对象模型
        • nonstatic data members 放在每一个 class object 之内;
        • static data members 放在个别的 class object 之外;
        • static member functions 和 nonstatic member functions 放在个别的 class object 之外;
        • virtual member functions:
          • 每一个 class 产生多个指向 virtual functions 的指针,由这些指针组成虚函数表 virtual table(vtbl);
          • 每一个 class object 添加一个指向虚函数表 virtual table 的指针,这个指针被称为 vptr
    • C++继承:
      • 单一继承:继承 base class 的数据;
      • 多重继承:从多个 base class 继承数据;
      • 虚继承:virtual base class 不管在继承链中被派生多少次,只会存在一个实例;每一个 class object 保存指向 virtual base class 实例的指针;
    • C++多态:
      • C++只有通过 pointer 指针 和 reference 引用的间接处理多态;
      • 支持多态的方法:
        • 隐式的转换操作:例如 基类对象指针指向派生类对象;
        • virtual function 机制:通过指针调用相对应的函数;
        • dynamic_cast 和 typeid 运算符:dynamic_cast 使派生类对象指针能够指向基类对象;
    • class object 内存大小:
      • object 内部 nonstatic data member 的总和;
      • 内存对齐引起的填充字节空间;
      • 由 virtual 功能引起的额外负担;
    • 指针类型:
      • 根据其所寻址的 object 类型引导编译器解释某个特定地址中的内存内容及其大小;
      • 类型为 void *的指针只能够持有一个地址,而不能通过它操作所指向的 object 对象;
      • 类型转换 static_cast(静态转换)、const_cast(常量转换)、dynamic_cast(动态转换)、reinterpret_cast(重解释转换) 不会改变指针的真正地址,它只影响所指的内存大小及其内容的解释方式;
    • 多态的内存布局: pointer 指针 和 reference 引用的间接处理多态,不会引发内存地址改变,只是改变他们所指向的内存的大小及其内容的解释方式;
1 0
原创粉丝点击