虚表指针的初始化时期
2017-03-26 18:28
225 查看
虚表指针是由构造函数初始化的。我这里只分析单一继承的情况,多重继承的情况我还没有弄明白。
比如说我现在有两个类A,B, B继承A。如果我创建一个B对象,那么会先调用A的构造函数,再调用B的构造函数。在调用A的构造函数的时候,会将vptr指向A的虚表地址,调用B的构造函数的时候,再重新将vptr指向B的虚表地址。下面我用代码来证明。
因为vptr的赋值会在我写的代码之前赋值好,所以我在A, B的构造函数里面将vptr的地址打印出来。
主函数我输出a,b两个对象的vptr和构造函数的vptr做个对比。
结果如下:
先创建一个a对象,调用了一下A的构造函数。
再创建一个b对象,先调用了A的构造函数,打印出此时A的虚表地址,和上面创建a对象的时候一样。再调用B的构造函数,打印出来的是B的虚表地址。
比如说我现在有两个类A,B, B继承A。如果我创建一个B对象,那么会先调用A的构造函数,再调用B的构造函数。在调用A的构造函数的时候,会将vptr指向A的虚表地址,调用B的构造函数的时候,再重新将vptr指向B的虚表地址。下面我用代码来证明。
因为vptr的赋值会在我写的代码之前赋值好,所以我在A, B的构造函数里面将vptr的地址打印出来。
主函数我输出a,b两个对象的vptr和构造函数的vptr做个对比。
typedef void(*Fun)(void); class A{ public: A(){ cout << "in A constructor" << endl; cout << "vtable addr: " << *(int*)(this) << endl; Fun f = (Fun)*((int*)*(int*)(this)); f(); } virtual void fun(){ cout << "A fun" << endl; } virtual void bar(){ cout << "B bar" << endl; } virtual ~A(){} }; class B: public A{ public: B(){ cout << "in B constructor" << endl; cout << "vtable addr: " << *(int*)(this) << endl; Fun f = (Fun)*((int*)*(int*)(this)); f(); } virtual void fun(){ cout << "B fun" << endl; } }; int main(){ A a; B b; //Fun f = (Fun)*((int*)*(int*)(&a)); //f(); cout << "A vtable addr: " << *(int*)(&a) << endl; cout << "B vtable addr: " << *(int*)(&b) << endl; }
结果如下:
先创建一个a对象,调用了一下A的构造函数。
再创建一个b对象,先调用了A的构造函数,打印出此时A的虚表地址,和上面创建a对象的时候一样。再调用B的构造函数,打印出来的是B的虚表地址。
in A constructor vtable addr: 4198256 A fun in A constructor vtable addr: 4198256 A fun in B constructor vtable addr: 4198192 B fun A vtable addr: 4198256 B vtable addr: 4198192
相关文章推荐
- 类类型的指针初始化与内存的释放
- 关于百度地图SDK在" SDKInitializer.initialize(this);"初始化报空指针的问题
- C语言指针的初始化和赋值
- 结构体二级指针的初始化
- 延迟初始化 指针地址 NSTimer
- 指针--不能初始化?
- C指针的初始化与赋值
- 你必须知道的指针基础-6.内存的初始化及结构体的使用
- 指针用之前要初始化
- 内存泄露——结构体成员指针未初始化
- android之List<T>的空指针问题_List的初始化
- 关于const指针和指向const对象的指针的初始化问题
- [置顶] 记录一个指针问题(内存空间的初始化)
- C语言指针的初始化和赋值
- 研究具有静态存储时期的变量的初始化时间
- 结构体指针初始化问题
- 二级指针作为函数参数传递初始化的一点总结
- c语言结构体指针初始化
- 二维数组指针的定义和初始化
- 结构体指针初始化以及结构体中成员变量是指针的初始化