共用体和虚函数解决方案
共用体和虚函数
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(),为什么变成执行基类的函数了呢?
请教!!!!!!
------解决方案--------------------
第一题:
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
以前写的