C++总结6——继承与多态的笔试题
来源:互联网 发布:阿里云域名解析端口号 编辑:程序博客网 时间:2024/05/22 16:47
1—————————————————
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; } virtual ~Base() { cout<<"~Base()"<<endl; } virtual void Show(int i= 10)//虚函数 { cout<<"Base::Show(), i="<<i<<endl; }private: int _ma;};class Derive : public Base{public: Derive(int data1, int data2):Base(data1),_mb(data2) { cout<<"Derive()"<<endl; } ~Derive() { cout<<"~Derive()"<<endl; }; virtual void Show(int i= 20)//虚函数 { cout<<"Derive::Show(), i="<<i<<endl; }private: int _mb;};int main(){ Base *p = new Derive(10,10); p->Show(); delete p; return 0;}
p->Show();函数有默认的参数,在调用过程中没有传递参数。编译期进行形参压栈,已经将基类的Show()函数的10压进栈了,调用派生类中的Show时,不再对其进行初始化。若要对虚函数中的值进行赋值,不要在基类虚函数的参数列表中赋默认值。
2.———————————————————————
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; } virtual ~Base() { cout<<"~Base()"<<endl; } virtual void Show() { cout<<"Base::Show()"<<endl; } void Show(int i) { cout<<"Base:Show(int)"<<endl; }private: int _ma;};class Derive : public Base{public: Derive(int data1, int data2):Base(data1),_mb(data2) { cout<<"Derive()"<<endl; } ~Derive() { cout<<"~Derive()"<<endl; }private: virtual void Show() { cout<<"Derive::Show()"<<endl; }private: int _mb;};int main(){ Base *p = new Derive(10,20); p->Show(); delete p; return 0;}
在编译时,发现是基类的指针指向派生类的对象,并且该基类中有虚函数,故采用动态绑定。在运行时,Derive调用自己的私有Show()函数。
3.—————————————————————-
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; Clear(); } void Clear() { memset(this, 0 ,sizeof(*this)); } virtual ~Base() { cout<<"~Base()"<<endl; } virtual void Show() { cout<<"Base::Show()"<<endl; }pr`vate: int _ma;};int main(){ Base b(10); Base *p = &b; p->Show(); delete p; return 0;}
程序崩溃!
在Base类的构造函数中调用clear()函数,将刚构造的对象b清空了。p调用show(),非法访问内存,程序崩溃!
看下面一段代码段,结果什么呢?
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; Clear(); } void Clear() { memset(this, 0 ,sizeof(*this)); } virtual ~Base() { cout<<"~Base()"<<endl; } virtual void Show() { cout<<"Base::Show()"<<endl; }private: int _ma;};class Derive : public Base{public: Derive(int data1, int data2):Base(data1),_mb(data2) { cout<<"Derive()"<<endl; } ~Derive() { cout<<"~Derive()"<<endl; } virtual void Show() { cout<<"Derive::Show()"<<endl; }private: int _mb;};int main(){ Base *p = new Derive(10,10); p->Show(); delete p; return 0;}
对象d中,基类Base的内存都被清空了,但是在Derive的构造函数中,又将虚表的地址写在虚表指针的内存里,故可以访问Show()函数。
4.————————————————————————-
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; Show(); } virtual ~Base() { cout<<"~Base()"<<endl; } virtual void Show() { cout<<"Base::Show()"<<endl; }private: int _ma;};class Derive : public Base{public: Derive(int data1, int data2):Base(data1),_mb(data2) { cout<<"Derive()"<<endl; Show(); } ~Derive() { cout<<"~Derive()"<<endl; } virtual void Show() { cout<<"Derive::Show()"<<endl; }private: int _mb;};int main(){ Derive d(10,10); return 0;}
在构造函数里调用虚函数,都是静态绑定。Base类构造函数调用Base::Show();Derive类构造函数调用Derive::Show()
5.———————————————————————-
#include <iostream>using namespace std;class Base{public: Base(int data):_ma(data) { cout<<"Base()"<<endl; } virtual ~Base() { cout<<"~Base()"<<endl; } void Show() { cout<<"Base::Show()"<<endl; }private: int _ma;};class Derive : public Base{public: Derive(int data1, int data2):Base(data1),_mb(data2) { cout<<"Derive()"<<endl; } ~Derive() { cout<<"~Derive()"<<endl; } virtual void Show() { cout<<"Derive::Show()"<<endl; }private: int _mb;};int main(){ Base *p = new Derive(10,10); p->Show(); delete p; return 0;}
Base类的Show函数不是虚函数,Derive类的Show函数是虚函数。p->Show();采用静态绑定,在编译时已经确定调用的是Base类的Show函数。
阅读全文
0 0
- C++总结6——继承与多态的笔试题
- C++——【继承】总结
- objective-c自学总结(三)---面向对象的封装,继承与多态
- C++总结5——继承与多态
- C++--继承与多态
- 黑马程序员——Objective-C的封装、继承与多态
- Ryan的OC学习总结-----3 继承与多态
- c++继承与多态概念的简单总结
- c语言笔试题总结
- C语言笔试题总结
- C语言下的封装、继承与多态
- C语言模拟实现C++的继承与多态
- C语言模拟实现C++的继承与多态
- C语言实现C++的封装继承与多态
- C语言模拟实现C++的继承与多态
- C语言笔试题(11)——关于与零值比较的
- 笔试总结——c、c++【持续更新】
- 【C++】继承和多态之——菱形继承
- Linux Mint 18.2 安装图像软件GIMP之画箭头&添加画笔
- Java 重写equals 的范式
- 任意改变FMX的TPanel控件的颜色
- DetachedCriteria 分页Projection取消聚合条件 (解决方案)
- java数据类型之基本数据类型
- C++总结6——继承与多态的笔试题
- 常见排序算法实现
- DATA TYPES
- WebGL之旅(一)canvas、WebGL和shader简介
- splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
- kali2.0 2017国内源添加+系统信息相关命令+中文输入法安装
- LeetCode#8 String to Integer (atoi)
- Python 离线安装cx_Oracle
- LeetCode#9* Palindrome Number