阿里机试题目_虚函数
2015-08-13 22:34
232 查看
参考:
http://www.mamicode.com/info-detail-864409.html
父类father中存在虚函数,子类child继承父类。父类和子类对象中都存在一个指针,指向虚函数表。所以sizeof(data_f)为4,sizeof(data_c)为4。
第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()。
输出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)
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)
相关文章推荐
- C/C++中关于qsort和sort函数的使用
- 中缀表达式及后缀表达式图解
- sql中连接的几种方式
- R Learning-swirl-lapply and sapply
- 获取某个类或者某个实例的Class的三种方式
- wxPython Cookbook (Chatper1)part 2
- xhprof 安装
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
- Message
- Java中Properties类的操作
- 用户注册登陆查询界面
- [CareerCup] 5.4 Explain Expression ((n & (n-1)) == 0) 解释表达式
- MSP430 G2553 基本时钟模块+ (Basic Clock Module+)
- zoj 3795 Grouping tarjan缩点 + DGA上的最长路
- C#实现插件式架构的方法
- HTML&CSS
- 认知http
- 特征提取代码总结
- org.apache.commons.lang3功能示例
- 利用SimpleExpandableListAdapter为ExpandableListActivity提供数据