c++中成员变量指针的大小
本帖最后由 chaoguo1234 于 2013-07-07 02:56:22 编辑 c++源码如下:
#include <cstdio>
#include <iostream>
using namespace std;
class Top {
public:
int i;
};
class Left : virtual public Top {
public:
int j;
};
class Right : virtual public Top {
public:
int k;
};
class Bottom : public Left, public Right {
public:
int l;
};
int main() {
Bottom b;
int Top::*tip = &Top::i;
int Bottom::*bip = &Bottom::i;
int Left::*lip = &Left::i;
int Right::*rip = &Right::i;
int Left::*ljp = &Left::j;
int Bottom::*bjp = &Bottom::j;
int Right::*rkp = &Right::k;
int Bottom::*bkp = &Bottom::k;
int Bottom::*blp = &Bottom::l;
cout << "sizeof(tip) = " << sizeof(tip) << endl;
cout << "sizeof(bip) = " << sizeof(bip) << endl;
cout << "sizeof(lip) = " << sizeof(lip) << endl;
cout << "sizeof(rip) = " << sizeof(rip) << endl;
cout << "sizeof(ljp) = " << sizeof(ljp) << endl;
cout << "sizeof(bjp) = " << sizeof(bjp) << endl;
cout << "sizeof(rkp) = " << sizeof(rkp) << endl;
cout << "sizeof(bkp) = " << sizeof(bkp) << endl;
cout << "sizeof(blp) = " << sizeof(blp) << endl;
}
分享到:
[解决办法]
成员指针的实现由编译器决定,不同的编译器中实现可能不一样的。
成员指针可以分数成员数据指针和成员函数指针。
成员数据指针要处理两种成员:普通数据成员和来自虚基类的数据成员,前者只需要一个地址偏移量就可以了,但后者不行,因为虚基类会在不同派生类中有不同的偏移位置,如果只简单地记载偏移位置,在下面的代码中将无法正确工作。因此,数据成员指针中必须能够保存一些信息以帮助编译器正确地找到该虚基类的起始位置——这个信息通常是一个虚拟表项索引号。
class vbase
{
public:
int d1;
};
public base1 : virtual vbase
{
public:
int d2;
};
public base2: virtual vbase
{
public:
int d3;
};
public derived : public base1, public base2
{
public:
int d4;
};
int main()
{
int base1::*member1 = &base1::d1;//这里确定member1的值
int base2::*member2 = &base2::d1;//这里确定member2的值
derived obj;
obj.d1 = 123;
std::cout << d1.*member1 << "\t
[解决办法]
<< d1.*member2 << std::endl;
//如果member1和member2中只保存一个偏移量信息,这里将至少有一个不会得到正确的值
//因为member1和member2在被赋值时还不知道将被应用到一个derived对象上
//而vbase::i在derived中与在base1和base2至少其一的偏移量一定不同。
//member1和member2在被赋值以前不知道自己会不会用来指向虚基类
//所以,只要有虚基类存在,该类的数据成员指针就不会只是一个整数的大小。
}