阿里机试题目_虚函数
来源:互联网 发布:淘宝优酷会员怎么登陆 编辑:程序博客网 时间: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)
- 阿里机试题目_虚函数
- 阿里笔试题,虚函数
- Java技术_基础技术(0003)_类执行顺序详解+实例(阿里面试题)+详细讲解+流程图
- C++_虚函数
- 阿里面试题解答
- 阿里面试题
- 阿里面试题备份
- 阿里dba面试题
- 阿里面试题
- 阿里实习生面试题
- 阿里客户端面试题
- 阿里面试题
- 阿里前端面试题
- 阿里前端面试题
- 阿里前端面试题
- 阿里前端面试题
- 阿里面试题
- 阿里面试题总结
- //实现中等难度通讯录。需求: //1、定义联系人类Contact。实例变量:姓名(拼音,首字母大写)、性别、电话号码、住址、分组名称、年龄。方法:自定义初始化方法(姓名、电话号码)、显示联系人信息
- Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()
- C/C++中关于qsort和sort函数的使用
- HDU 1022 Train Problem I
- 黑马程序员———Java编程基础之循环和函数
- 阿里机试题目_虚函数
- Scala入门到精通——第二十六节 Scala并发编程基础
- NSFileHandle拷贝大文件+多线程
- api
- nginx的配置详解
- opencv识别正方形(矩形)代码
- 为什么计算机时间和众多编程语言要从1970年1月1日开始算起
- 随笔
- P命名空间给Bean属性注值