读书人

共用体和虚函数解决方案

发布时间: 2012-05-27 05:42:30 作者: rapoo

共用体和虚函数
1 共用体所占内存大小应该是成员所占内存最大的那一个
程序:union xx
{int a[5] ;
char b[10];
double c ;
};
printf("%d\n",sizeof(xx)) ; //输出结果是24,理论上应该是20才对吧?

2 多态性的实现原理:编译器为每个类的对象建立虚函数表vtable,设置虚函数表指针vptr,在执行函数时根据具体对象的虚函数指针查找函数的地址。
class base
{public:
virtual void fun(printf("base function run!"));

int a ;
};
class test:public base
{public:
void fun(printf("test function run!"));

int b;
};

void main()
{
test tt;
base *p = &tt ;
p->fun();
}
输出结果:test function run!
这个可以理解,编译时为tt建立虚函数表:
vptr------------test:fun()
int b ;
同时base类也有虚函数表
vptr------------base:fun()
int a ;
但调用pbase->fun()时,参数为test类对象,编译器通过test类的vptr查找到函数fun()的地址:vptr+1 ,然后执行,这个是正确的,现在我把base类的fun()函数不设为虚函数,而将test类的fun()函数设为虚函数,那么输出结果变为base function run!按照从虚函数表查找函数地址的原理,应该也是执行test类的fun(),为什么变成执行基类的函数了呢?

请教!!!!!!

[解决办法]
第一题:

C/C++ code
union a {    int a[5];    char b[10];    double c;};int main(void) {    int d[5];    char e[10];    double f;        cout << sizeof(d) << endl;    cout << sizeof(e) << endl;    cout << sizeof(f) << endl;    cout << sizeof(a) << endl;    return 0;}
[解决办法]
1.联合也是有对齐的,按照double大小对齐

2.既然改成非虚函数自然就不是动态的了。
[解决办法]
1 共用体所占内存大小应该是成员所占内存最大的那一个
程序:union xx
{int a[5] ;
char b[10];
double c ;
};
printf("%d\n",sizeof(xx)) ; //输出结果是24,理论上应该是20才对吧?

这里你还要考虑内存对齐。

http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx

以前写的

读书人网 >C++

热点推荐