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

继承对象模型

•  在C++编译器的内部类可以理解为结构体

•  子类是由父类成员叠加子类新成员得到的

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

 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++多态的实现原理:

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

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

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

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

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

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

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

  • yes-->编译器在对象VPTR所指向的虚函数表中查找add()的地址
  • no -->编译器直接可以确定被被调成员函数的地址
posted @ 2018-06-13 15:53 老姚大大 阅读(...) 评论(...) 编辑 收藏