标签:
有两个概念可以解释C++对象模型:
语言中直接支持面向对象程序设计的部分。
对于各种支持的底层实现机制。
1 #include <iostream>
2 #include<vector>
3 using namespace std;
4
5 class Base
6 {
7 public:
8 void fun1(){ cout << "Base fun1" << endl; }
9 virtual void fun2(){ cout << "Base fun2" << endl; }
10 private:
11 int a;
12 };
13
14 class Derive : public Base
15 {
16 public:
17 void fun1(){ cout << "Derive fun1" << endl; }
18 void fun2(){ cout << "Derive fun2" << endl; }
19 private:
20 int b;
21 };
22
23 int main()
24 {
25 Base b;
26 Derive d;
27 Base *p = &d;
28 p->fun1();
29 p->fun2();
30
31 system("pause");
32 return 0;
33 }
输出:基类指针p在运行时发生动态绑定,fun2调用子类方法,fun1由于没有virtual,仍然调用父类方法
内存模型:
指针的虚表指向子类方法地址
当一个类本身定义了虚函数,或其父类有虚函数时,为了支持多态机制,编译器将为该类添加一个虚函数指针(vptr)。虚函数指针一般都放在对象内存布局的第一个位置上,这是为了保证在多层继承或多重继承的情况下能以最高效率取到虚函数表。
当vprt位于对象内存最前面时,对象的地址即为虚函数指针地址。
标签:
原文地址:http://www.cnblogs.com/raichen/p/5744300.html