c++学习笔记(二)隐藏和覆盖详解&简单判断运行结果

c++隐藏和覆盖详解

首先隐藏和覆盖是针对基类和子类的两个函数

而非同一个类中的函数(那是重载)

覆盖: 子类覆盖基类

只有一种情况: 同名同参,基类必须有virtual

隐藏: 子类隐藏基类

同名同参 基类必须无virtual
同名不同参 virtual有无都随意

判断运行结果

隐藏看指针类型
覆盖看实体类型
重载看参数

先不需要理解,只需要记住上面几点下面我们开始分析程序

#include <iostream>
using namespace std;

class Base
{
public:
    void s(){cout << "base :: s" << endl;} //父类独有某个函数

    /*单继承的情况下:
    //父类和父子类都virtual 效果一样
    //仅仅子类virutal 相当于没有加virtual
    */

    virtual void g(int x){cout << "base :: g" << endl;} //父类virtual
    void h(int x){cout << "base :: h" << endl;}         //子类virtual
    virtual void v(int x){cout << "base :: v" << endl;} //父子类都virtual


    /*隐藏*/
    //1. 父子类同样的函数名, 但是参数不一样, 父类被隐藏.(与virtual无关)
    //2. 父子类同名同参函数, 但是父类没有virtual, 父类被隐藏
    //对于第二条 例如函数 f() 和 h()
    void hide(int x){cout << "base  hide" << endl;}
    void f(int x){cout << "base :: f" << endl;}

};

class Drived : public Base
{
public:

    void g(int x){cout << "drived :: f" << endl;}
    virtual void h(int x){cout << "drived :: f" << endl;}
    virtual void v(int x){cout << "drived :: v" << endl;}


    /*隐藏*/
    void hide(int x, int y){cout << "drive hide  " << endl;}
    void f(int x){cout << "drived :: f" << endl;} 
};

int main11()
{
    Drived d;
    //自己调用自己当然都是drive咯
    d.s();       //ok   base  子类成员可以调用父类独有的函数名
    d.f(1);      // drive
    d.g(1);      // drive  
    d.h(1);      // drive  
    d.v(1);      // drive
    d.hide(1, 1);// drive
    //d.hide(1);  //error  调用格式正确 但是父类被隐藏无法调用

    /*同上 全是base*/
    Base b;
    b.f(1);
    b.g(1);
    b.h(1);
    b.v(1);
    b.hide(1);

    return 0;
}
int main6()
{
    Base b;
    Drived *p;
    //p = &b;       //报错, 子类指针怎么可以越俎代庖呢?
    return 0;
}

"重点来了 隐藏覆盖主要就是针对以下的情况"
int main()
{
    Base *pb;
    Drived *pd;
    Drived d;

    //覆盖: 同名同参+父类加上virtual 基类的函数被子类覆盖掉
    //隐藏: 同名同参无(基类)virtual   同名不同参(virtual随意)

    //结果:  
    //重载看参数  
    //覆盖看实体对象类型
    //隐藏看指针类型
    pb = &d;
    pd = &d;

    pb->f(1);        //1. base   同名同参无virtual) 看指针
    pb->h(1);        //2. base   同上(基类无virtual) 
    pb->g(1);        //3. drive  覆盖 同名同参基类有virtual 看实体 
    pb->v(1);        //4. drive  同上
    pb->hide(1);     //5. base   同名不同参, 看指针

    pd->f(1);        // drive 隐藏  理由同1 看指针 是drive
    pd->h(1);        // drice 隐藏  同2
    pd->g(1);        // drive 同3   看实体
    pd->v(1);        // drive 同4
    pd->hide(1,1);   // drive 同5

    return 0;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值