阿里机试题目_虚函数

来源:互联网 发布:淘宝优酷会员怎么登陆 编辑:程序博客网 时间:2024/05/16 07:07

参考:

http://www.mamicode.com/info-detail-864409.html

class my{};int main(){my data;cout<<sizeof(data)<<endl;}
当我们建立一个类,类中什么数据也没定义,建立该类的一个对象,可以测试其对象所占的字节数为1。

class my{char b;};int main(){my data;cout<<sizeof(data)<<endl;}
这个类中只有一个char型数据,占一个字节。

class my{char b;short a[7];};int main(){my data;cout<<sizeof(data)<<endl;}
my类中char类型占1个字节,short类型每个占2个字节,考虑到字节对齐的原因,这个类的一个对象占16个字节。

class father{virtual void function(){};};class child:public father{};int main(){father data_f;child data_c;cout<<sizeof(data_f)<<endl;cout<<sizeof(data_c)<<endl;}

父类father中存在虚函数,子类child继承父类。父类和子类对象中都存在一个指针,指向虚函数表。所以sizeof(data_f)为4,sizeof(data_c)为4。

#include <iostream>using namespace std;class animal{protected:       int age;public:       virtual void print_age(void) = 0;//纯虚函数};class dog : public animal{public:       dog(){this -> age = 2;}       ~dog(){}       virtual void print_age(void){cout<<"Wang, my age = "<<this -> age<<endl;}};class cat: public animal{public:       cat(){this -> age = 1;}       ~cat(){}      virtual void print_age(void){cout<<"Miao, my age = "<<this -> age<<endl;}};int main(void){       cat kitty;//1       dog jd;//2       animal * pa;//3       int * p = (int *)(&kitty);//4       int * q = (int *)(&jd);//5       p[1] = q[1];//6       pa = &kitty;//7       pa -> print_age();//8<span style="white-space:pre"></span>pa=&jd;//9<span style="white-space:pre"></span>pa->print_age();//10       return 0;}
第1行定义了cat类的一个对象kitty,这将调用cat::cat()构造函数。
第2行定义了dog类的一个对象jd,这将调用dog::dog()构造函数。

第3行:定义了一个基类指针,因为类animal中含有纯虚函数,所以不能定义animal类的对象。

第4行:先是用&符号取得对象kitty的地址,并使用强制类型转换把对象指针转化为int 类型的指针。

第5行:先是用&符号取得对象jd的地址,并使用强制类型转换把对象指针转化为int类型的指针。

第6行:

p和q是分别指向kitty和jd两个对象的首地址,因为类Cat和Dog都包含虚函数,所以kitty和jd两个对象均包含一个虚函数表,并通过一个指针指向它,p[0]和q[0]就是该虚函数表指针,而p[1]和q[1]则为该对象的数据成员即age的值,p[1] = q[1];将kitty的age被修改为2。

第7、8:

pa指针声明时的类型为基类animal,它指向派生类kitty对象,典型的多态特性,则pa的静态类型为animal,动态类型为cat。
而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是kitty的成员函数print_age()。

第9、10:

pa指针声明时的类型为基类animal,它指向派生类jd对象,典型的多态特性,则pa的静态类型为animal,动态类型为dog。
而print_age()是虚函数,因此是动态绑定,动态绑定指向是动态类型的成员,因此调用的是jd的成员函数print_age()。


#include "stdio.h"class Base { public:     int Bar(char x)     {         return (int)(x);     }     virtual int Bar(int x)     {         return (2 * x);     } }; class Derived : public Base { public:     int Bar(char x)     {         return (int)(-x);     }     int Bar(int x)     {         return (x / 2);     } }; int main(void) {     Derived Obj;     Base *pObj = &Obj;     printf("%d<span style="white-space:pre"></span>", pObj->Bar((char)(100)));     printf("%d<span style="white-space:pre"></span>", pObj->Bar(100)); }

输出100 50

Derived Obj;
Base *pObj = &Obj;
printf("%d,", pObj->Bar((char)(100)))
printf("%d,", pObj->Bar(100));
第一个Bar(char)是非虚函数,因此是静态绑定,静态绑定是指指针指向声明时的对象,pObj声明时为Base类,因此调用的是Base类的Bar(char)
第二个Bar(char)是虚函数,因此是动态绑定,动态绑定是指指针指向引用的对象,pObj引用Derived对象,因此调用的是Derived类的Bar(int)


0 0
原创粉丝点击