覆盖、隐藏与重载

  今天写代码的时候,在思考到底是返回派生类对象,还是强制转换为基类对象,强制转换后为基类指针指向派生类的对象,指针的地址不同,但是指向的内容相同,这也就联想到了覆盖、隐藏,于是去百度了下,看到了一篇blog:http://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html,然后就明白多了
1、成员函数被重载的特征:

 (1)相同的范围(在同一个类中);

 (2)函数名字相同;

 (3)参数不同;

 (4)virtual关键字可有可无。

2、覆盖是指派生类函数覆盖基类函数,特征是:

 (1)不同的范围(分别位于派生类与基类);

 (2)函数名字相同;

 (3)参数相同;

 (4)基类函数必须有virtual关键字。

例如:

class base{
public:
    void print()
    {
        cout<<"this is base print"<<endl;
    }
    virtual void vprint()
    {
        cout<<"this is base vprint"<<endl;
    }   
};

class child:public base{
public:
    void print()//这不是重载,覆盖了基类的print
    {
        cout<<"this is child print"<<endl;
    }
    void vprint()//重写了基类的vprint,隐藏了基类的vprint
    {
        cout<<"this is child vprint"<<endl;
    }
};

int main()
{
        child *b=new child();
        base *a=b;
        a->print();
        b->print();
        a->vprint();
        b->vprint();
    return 0;
}

结果:
这里写图片描述

a为基类指向派生类的指针,b为派生类的指针
a->print()调用了基类中的print,因为派生类中所写的print与基类print同名,所以隐藏了基类的print,因为a为基类的指针,所以访问到的是基类的print
b->print()调用的是派生类的print,
a->vprint()调用的是派生类的vprint,因为加了virtual,覆盖了基类中的vprint,所以访问到的是派生类的vprint,若想访问基类的vprint,就只能通过基类的对象访问
b->vprint()调用派生类的vprint,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值