您的位置:首页 > 编程语言 > C语言/C++

【深入探索c++对象模型】data语义学二

2014-07-07 13:50 218 查看
单一继承中,base class 和derived class的对象都是从相同的地址开始,其间差异只在于derived class比较大,用以容纳自己的nonstatic members。

若vptr放在class object的起始处,如果base class没有虚函数而derived class有,那么单一继承的上述机制就被打破,把一个derived object转换为其base类型,就需要编译器的介入,用于调整地址。

class X {
public:

static void fun() {
printf("%d\n", &X::a);
printf("%d\n", &X::b);
printf("%d\n", &X::m);
printf("%d\n", &X::n);
printf("%d\n", &X::x);
printf("%d\n", &X::y);
}
int a;
int b;
protected:
int m;
int n;
private:
int x;
int y;

};
int main()
{
X::fun();
system("pause");
return 0;
}


View Code
输出为0,4,8,12,16,20

取某个成员的地址,表示该成员在class object中的偏移量,c++要求同一个access level中的members在内存中的排列次序应该和其声明次序相同,vptr在vs2013中应该是放到对象的尾部了。

参考:
http://blog.csdn.net/littlehedgehog/article/details/5442430 http://blog.csdn.net/hyg0811/article/details/11951855# http://blog.csdn.net/wangqiulin123456/article/details/8059536
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: