虚函数指针(vptr)与虚函数表(vptb)
2015-03-24 23:24
134 查看
1. 基类指针指向派生类对象
问题:
这里的三个地址一样吗?为什么。
运行结果:
解释:
1)&b和pa1的地址相同没问题,因为类型一个是B* ,一个是int*,指针类型影响的只是指向内存的大小和其中内容的解释方式。比如: int* 代表的含义就是:从变量首地址开始,共取sizeof(int)=4个地址,将地址中的值组成一个int值。
2)为什么&b和pa的地址不相同?
答:首先我们要了解哪些东西是放到类变量中的:
(1)非静态成员变量
(2)虚函数指针(4byte)
所以,class A定义的对象中只会包含a变量。class B是继承于class A,所以他包含a变量,除此之外还有一个虚函数指针(暂且命名:vptr1),因为它的里面有虚函数。那a变量和vptr1在b对象中存放的顺序是怎么样的呢?
(1)vptr1
(2)a
注:vs2010顺序是这样,其他编译器可能不同。
所以当A* pa = &b的时候,编译器是知道这是不同类型且class A是 class B的父类,所以会将b对象中的class A部分对应地址赋值给pa。所以这里正好偏移了4byte(从输出结果可见)。
#include "stdafx.h" #include <iostream> using namespace std; class A { public: A():a(10){} private: int a; }; class B : public A { public: virtual void print() { cout<<"it is B print"<<endl; } }; void main() { B b; A *pa = &b; int *pa1 = (int*)&b; cout<<"b的首地址是:"<<&b<<endl; cout<<"pa指向的地址是:"<<pa<<endl; cout<<"pa1指向的地址是:"<<pa1<<endl; }
问题:
这里的三个地址一样吗?为什么。
运行结果:
解释:
1)&b和pa1的地址相同没问题,因为类型一个是B* ,一个是int*,指针类型影响的只是指向内存的大小和其中内容的解释方式。比如: int* 代表的含义就是:从变量首地址开始,共取sizeof(int)=4个地址,将地址中的值组成一个int值。
2)为什么&b和pa的地址不相同?
答:首先我们要了解哪些东西是放到类变量中的:
(1)非静态成员变量
(2)虚函数指针(4byte)
所以,class A定义的对象中只会包含a变量。class B是继承于class A,所以他包含a变量,除此之外还有一个虚函数指针(暂且命名:vptr1),因为它的里面有虚函数。那a变量和vptr1在b对象中存放的顺序是怎么样的呢?
(1)vptr1
(2)a
注:vs2010顺序是这样,其他编译器可能不同。
所以当A* pa = &b的时候,编译器是知道这是不同类型且class A是 class B的父类,所以会将b对象中的class A部分对应地址赋值给pa。所以这里正好偏移了4byte(从输出结果可见)。
相关文章推荐
- vtbl(虚函数表)与vptr(虚函数表指针)
- 虚函数表指针vptr的测试
- vtbl(虚函数表)与vptr(虚函数表指针)
- vtbl(虚函数表)与vptr(虚函数表指针)
- vtbl(虚函数表)与vptr(虚函数表指针)
- 虚函数表(vtbl)和虚表指针(vptr)
- vtbl(虚函数表)与vptr(虚函数表指针)
- vtbl(虚函数表)与vptr(虚函数表指针)
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 深入剖析C++多态、VPTR指针、虚函数表
- C++对象内存模型2 (虚函数,虚指针,虚函数表)
- vtbl(虚函数表)与vptr(虚函数表指针)
- 虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 虚函数表(vtbl)和虚表指针(vptr)
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图 .
- C++对象内存模型2 (虚函数,虚指针,虚函数表)
- 虚函数表(vtbl)和 虚表指针(vptr)
- vtbl(虚函数表)与vptr(虚函数表指针)
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图
- 虚函数表(vtbl)与虚函数表指针(vptr)