您的位置:首页 > 其它

虚函数指针(vptr)与虚函数表(vptb)

2015-03-24 23:24 134 查看
1. 基类指针指向派生类对象

#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(从输出结果可见)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: