多态易错题3

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

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值