多态易错题4
来源:互联网 发布:python爬虫怎么入门 编辑:程序博客网 时间:2024/05/16 01:48
看下面代码,输出结果
#include<iostream>#include<string>using namespace std;class Canimal{protected: string mname;public: Canimal(string name):mname(name){} virtual void bark() =0;};class dog:public Canimal{public: dog(string name):Canimal(name){}; void bark() { cout<<mname<<":"<<"wang wang awng "<<endl; }};class cat:public Canimal{public: cat(string name):Canimal(name){} void bark() { cout<<mname<<":"<<"miao miao miao "<<endl; }};int main(){ Canimal *s1 = new dog("dog"); Canimal *s2 = new cat("cat"); /////////////////////////////// int *p11 =(int*)s1; int*p22 = (int*)s2; int tep = *p11; *p11 =* p22; *p22= tep;///////////////////////// s1->bark(); s2->bark(); return 0;}
dog:miao miao miao
cat:wang wang awng
请按任意键继续…
如果没有main()里的那组交换代码,即///////包含的部分,输出结果是正常的,dog:wang wang wang
cat:miao miao miao ,加上交换,就变了。
因为,交换的是类对象的前四个字节,而前四个字节存放的是vfptr(虚函数表指针),于是调用dog的bark()查询的是cat的虚函数表,于是调用的是cat的bark(); 调用cat的bark是,查询的是dog 虚函数表,于是就调用了dog的bark于是结果:
dog:miao miao miao
cat:wang wang awng
0 0
- 多态易错题4
- 多态易错题
- 多态易错题2
- 多态易错题3
- 多态易错题5
- 4
- 4
- (4)
- 4
- 4
- 4
- 4
- 4
- 4
- 4
- 4
- 4
- 4
- 120闹钟AlarmManage
- 【技术分享】CVE-2016-6662:Mysql远程代码执行/权限提升技术分析正式版(9/13 10:47更新)
- 电脑小问题汇总
- NodeJS+shouldJS+Istanbul搭建单元测试
- 江南愤青关于对互联网金融的一点看法
- 多态易错题4
- linux下解压命令大全
- HTML网站商城首页轮播图
- code review的思考
- tjut 3593
- java CAS原理深度解析
- 错误:java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
- Codeforces712B【= =】
- 好程序员的标准