也谈C++里覆盖(override),重载(overload),隐藏(hide)

        有点晕,昨天本来提交了这篇文章,但今天一看竟然没有了,是我没有放好,还是csdn的原因那(字数限制?)。不过没有关系,还是有时间把这篇文章重写一下。

        1》重载是指的一个作用域里的,同名函数,不同参数(参数数目不同,或者对应参数的类型不同,返回值类型无关)的一组类成员函数,忽略virtual关键字;

       

class Base{

         public:

        virtual void func1(); //(1) -------------------|     

        int  func1( int pm1);//(2)--------------------|overload

        int  func1(int pm1, int  pm2);//(3)--|

}

class Derived: pulic Base {

         public:

        void func1();//(4)

        int  func1( int pm1);//(5)

        int  func1(double pm1);//(6)    

}

         2》覆盖是一种多态的体现,即子类对基类的虚函数进行了重写,要求函数名和参数,以及返回值均相同,基类需要virtual关键字支持;

         (1)和(4)构成override, (2)与(5)不能构成,因为(2)没有virtual

         3》隐藏表现为:基类有某个函数的多个重载函数,子类对其中部分的重载函数进行了重写,或者引入新的同名不同参数/返回值的新函数,则未被重写的其他的重载函数在父类中被隐藏掉了。

        A  (5)的存在,隐藏了(2)和(3),例子如下:

             Derived* p = new Derived;

             p->func1(2, 3); // 编译出错

        B   通过基类指针指向父类时,新的重载函数被隐藏

             上述int  func1( int pm1);//(2)改为 virtual int  func1( int pm1);//(2)

             Base* p = new Derived;

             p->func1(0.01); // 调用(5)而不是(6)    

 

另外说明,覆盖或者重载,忽略范围(public/protected/private)差异

 

更多详尽的例子参考: http://www.chinaitpower.com/A/2002-04-23/20651.html

http://www.chinaitpower.com/A/2002-04-23/20652.html

http://www.chinaitpower.com/A/2002-04-23/20653.html

http://www.chinaitpower.com/A/2002-04-23/20654.html

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值