多态易错题3

举报
IM_STONE 发表于 2020/12/29 00:55:19 2020/12/29
【摘要】 看下面代码,是否可以运行; #include<iostream> #include<vld.h> using namespace std; class Base { private : int ma; public: Base(int n):ma(n){cout<<"Base()"<<endl;}//构造函数 void...

看下面代码,是否可以运行;

#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没有访问权限,
故编译不通过,
多态就多态在了运行时调用了哪个函数。

文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/doubleintfloat/article/details/52530481

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。