多态易错题3
来源:互联网 发布:专业的数控编程软件 编辑:程序博客网 时间:2024/05/20 19:31
看下面代码,是否可以运行;
#include<iostream>#include<vld.h>using namespace std;class Base{private : int ma;public: Base(int n):ma(n){cout<<"Base()"<<endl;}//构造函数 void virtual show(int i=100){cout<<"Base()"<<"i = "<<i<<endl;} virtual ~Base(){cout<<"~Base"<<endl;}//析构函数};class Derive: public Base{private : int mb; void show( int i=200){cout<<"derive()"<<"i ="<<i<<endl;}public: Derive(int n):Base(n){cout<<"Derive()"<<endl;}//构造函数 ~Derive(){cout<<"~Derive()"<<endl;}//析构函数};int main(){ Base*p = new Derive(10); p->show(); delete p; return 0;}
结果和上一篇结果一样;
Base()
Derive()
derive()i =100
~Derive()
~Base
请按任意键继续…
我们有多态易错题2知道,p调用的show()是派生类的,但此时派生类的show()是private的,还能否调用,
答案是可以的:
首先,在编译阶段编译器汇编时只知道p是base类型的,base里有show()函数,而且是public的,故可以访问,
在运行阶段,show是虚函数,show()的地址放在虚函数表里,派生类继承了基类的虚函数表,把基类的show()给覆盖了,于是运行时调用的show()是派生类的。
再看下面代码:
#include<iostream>#include<vld.h>using namespace std;class Base{private : int ma; void virtual show(int i=100){cout<<"Base()"<<"i = "<<i<<endl;} public: Base(int n):ma(n){cout<<"Base()"<<endl;}//构造函数 virtual ~Base(){cout<<"~Base"<<endl;}//析构函数};class Derive: public Base{private : int mb;public: Derive(int n):Base(n){cout<<"Derive()"<<endl;}//构造函数 void show( int i=200){cout<<"derive()"<<"i ="<<i<<endl;} ~Derive(){cout<<"~Derive()"<<endl;}//析构函数};int main(){ Base*p = new Derive(10); p->show(); delete p; return 0;}
这段代码编译不通过,因为,在编译时,编译器只看得见p是base类型的,base里show的访问限定符是private的,表示改陈原函数只能被它所在类中的成员函数及该类的友元函数使用。p没有访问权限,
故编译不通过,
多态就多态在了运行时调用了哪个函数。
0 0
- 多态易错题3
- 多态易错题
- 多态易错题2
- 多态易错题4
- 多态易错题5
- 3
- 3
- 3
- 3
- 3
- (3)
- 3
- 3
- 3
- 3
- 3
- 3
- 3
- IntelliJ IDEA 14 创建Web项目
- js快排
- MQTT - 开始使用
- 微动学习记录之linux服务器安装centOS 6.8系统
- 浅析linux设备驱动的clock(时钟)的注册
- 多态易错题3
- 进程间通信方式之(四)共享内存
- Unity 摄像机按照中心点移动
- 史上最全Html和CSS布局技巧
- Nand Flash的驱动程序
- tjut 3594
- JZOJ 4770 闭门造车(平面最近点对)
- (dubbo学习)MyEclipse中从github上clone dubbo源代码
- poi将excel转换成list集合,excel导入