函数覆盖与函数隐藏

// derive.cpp : 定义控制台应用程序的入口点。  
//  
#include "stdafx.h"  
#include <iostream>  
using namespace std;  
class base  
{  
public:  
    virtual void xfn(int i)  
    {  
        cout<<"base::xfn(int i)"<<endl;  
    }  
    virtual void yfn(float f)  
    {  
        cout <<"base::yfn(float f)"<<endl;  
    }  
    void zfn()  
    {  
        cout <<"base::zfn()"<<endl;  
    }  
    virtual void afn()  
    {  
        cout <<"base::afn()"<<endl;  
    }  
protected:  
private:  
};  
class derived:public base  
{  
public:  
        virtual void xfn(int i)  
       {  
           cout<<"derived::xfn(int i)"<<endl;  
       }  
       void yfn(int c)  
       {  
           cout <<"derived::yfn(int c)"<<endl;  
       }  
       void zfn()  
       {  
           cout <<"derived::zfn()"<<endl;  
       }  
       void fn()  
       {  
           cout << "derived::fn()"<<endl;  
       }  
protected:  
private:  
};  
int _tmain(int argc, _TCHAR* argv[])  
{  
    derived d;  
    base *pb = &d;  
    derived *pd = &d;  
/*基类与子类函数名、参数一样,且都为虚函数则形成覆盖,虚函数的覆盖产生多态。 
    基类与子类函数名一样,参数与虚函数只要不符合上面规则就属于隐藏。 
*/ 
    //一般来说,基类指针调用基类函数,之类指针调用子类函数,但多态情况除外:  
    pb->xfn(5);     //derived::xfn(int i),虚函数覆盖形成多态,调用子类函数。  
    pd->xfn(5);     //derived::xfn(int i)  
    pb->yfn(3.14f); //base::yfn(float f)  
    pd->yfn(3.14f); //derived::yfn(int c),虽然基类有Virtual,但与子类参数表不一样,所以这里  
                    //子类函数对基类函数形成隐藏。即便基类函数为float,也不能使用,因为子类看不到。  
    pb->zfn();      //base::zfn()  
    pd->zfn();      //derived::zfn(),函数、参数一样,但基类没有Virtual,还是会隐藏基类同名函数。  
    pb->afn();      //base::afn()  
    pd->afn();      //base::afn(),子类函数即没有覆盖也没隐藏,完全继承之基类。  
    //pb->fn();     //error:“fn”: 不是“base”的成员。  
    pd->fn();       //derived::fn()  
    cout<<endl<<endl;  
    base e;  
    base *pb1 = &e;  
    //derived *pd1 = &e;//error:不能用子类指针指向基类对象。  
    pb1->xfn(5);     //base::xfn(int i)  
    pb1->yfn(3.14f); //base::yfn(float f)  
    pb1->zfn();      //base::zfn()   
       
      
    return 0;  

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lz_26/archive/2009/07/16/4353450.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值