共用体和虚函数解决方案

共用体和虚函数
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.****.net/hairetz/archive/2009/04/16/4084088.aspx

以前写的