51-C++对象模型分析(下)

继承对象模型

•  在C++编译器的内部类能够理解为结构体ios

•  子类是由父类成员叠加子类新成员获得的数据结构

【范例代码】继承对象模型初探函数

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;  5 
 6 class Demo {  7 protected:  8     int mi;  9     int mj; 10 public: 11     virtual void print() { 12         cout << "mi = " << mi << ", "
13              << "mj = " << mj << endl; 14  } 15 }; 16 
17 class Derived : public Demo { 18     int mk; 19 public: 20     Derived(int i, int j, int k) { 21         mi = i; 22         mj = j; 23         mk = k; 24  } 25 
26     void print() { 27         cout << "mi = " << mi << ", "
28              << "mj = " << mj << ", "
29              << "mk = " << mk << endl; 30  } 31 }; 32 
33 // 证实Derived内存排布与Test类同样
34 struct Test { 35     void* p; 36     int mi; 37     int mj; 38     int mk; 39 }; 40 
41 int main(int argc, const char* argv[]) { 42     cout << "sizeof(Demo) = " << sizeof(Demo) << endl; 43     cout << "sizeof(Derived) = " << sizeof(Derived) << endl; 44 
45     Derived d(1, 2, 3); 46     Test* p = reinterpret_cast<Test*>(&d); 47 
48     cout << "Before changing ..." << endl; 49 
50  d.print(); 51 
52     p->mi = 10; 53     p->mj = 20; 54     p->mk = 30; 55 
56     cout << "After changing ..." << endl; 57 
58  d.print(); 59 
60     return 0; 61 }

多态对象模型

C++多态的实现原理:spa

•  当类中声明虚函数时,编译器会在类中生成一个虚函数表指针

•  虚函数表是一个存储成员函数地址的数据结构code

•  虚函数表是由编译器自动生成与维护的对象

•  virtual成员函数会被编译器放入虚函数表中blog

•  存在虚函数表时,每一个对象中都有一个指向虚函数表的指针继承

void run(Demo* p, int v) { p->add(v); }

编译器确认add()是否为虚函数?内存

  • yes-->编译器在对象VPTR所指向的虚函数表中查找add()的地址
  • no -->编译器直接能够肯定被被调成员函数的地址
相关文章
相关标签/搜索