C++继承时派生类与基类有同名函数时如何分别引用

一、普通函数同名:

当某个函数func()在基类和派生类中都有定义时,派生类中的函数func()将修改从基类继承来的函数func(),如果非要从派生类中访问基类的函数func(),有两种方法:

  1. 定义基类指针,让基类指针指向派生类对象,则调用的是基类func();
  2. 显示调用基类func(),形如:depriveName.baseName::func()或pDepriveName->.baseName::func();

二、虚函数同名:

  1. 基类func()前面加vitrual关键字,派生类可加可不加(父类的virtrual函数,在子类中也是virtrual,不加也ok(编译器其实会给加上),和加是一样的,但出于编程规范,统一加virtrual,增加可读性1.),这里只能显示调用:即depriveName.baseName::func()或pDepriveName->.baseName::func();这也正是虚函数能够实现多态性的关键,因为定义为基类的指针会根据指向的不同,调用不同对象的函数,而不再是调用基类函数。
  2. 若基类是纯虚函数,则不存在调用基类的情况,因为基类是抽象的,不能实例化。

三、以下代码可以加深理解:

#include<iostream>  
using namespace std;  

class Person
{
public:
    void func()
    {
        cout<<"base func"<<endl;
    };
public:
    virtual void func1()
    {
        cout<<"base  func1"<<endl;
    };
public:
    virtual void func2()
    {
        cout<<"base  func2"<<endl;
    };
public:
    ~Person(){};
};


class Man:public Person
{
public:
    void func()
    {
        cout<<"deperive func"<<endl;
    };
public:
     void func1()
    {
        cout<<"deprive  func1"<<endl;
    };
public:
    virtual void func2()
    {
        cout<<"deprive  func2"<<endl;
    };
public:
    ~Man(){};
};

void main( int, char** argv )
{

    Person person;
    Person * pPerson;
    Man man;
    Man * pMan;

    //基类和派生类非虚函数同名
    cout<<"********   基类和派生类函数同名  ************"<<endl<<endl;
    cout<<"person.func()的输出是:";
    person.func();

    cout<<"man.func()的输出是:";
    man.func();

    cout<<"(Person*)pPerson->func()的输出是:";
    pPerson = &man;
    pPerson->func();
    cout<<"man.Person::func()显示调用的输出是:";
    man.Person::func();



    //基类func1()前有virtual关键字,派生类func1()前无virtual关键字
    cout<<endl<<endl<<endl<<"********基类func1()前有virtual关键字,派生类func1()前无virtual关键字************"<<endl<<endl;

    cout<<"(Man*)pMan->func1()的输出是:";
    pMan = &man;
    pPerson->func1();

    cout<<"(Person*)pPerson->Person::func1()显示调用的输出是:";
    pPerson = &man;
    pPerson->Person::func1();

    cout<<"通过man.Person::func1()显示调用的输出是:";
    man.Person::func1();


    //基类和派生类func1()前面都有virtual关键字
    cout<<endl<<endl<<endl<<"********   基类和派生类func2()前面都有virtual关键字  ************"<<endl<<endl;

    cout<<"(Person*)pPerson->func2()的输出是:";
    pPerson = &man;
    pPerson->func2();

    cout<<"(Person*)pPerson->Person::func2()显示调用的输出是:";
    pPerson->Person::func2();

    cout<<"man.Person::func2()显示调用的输出是:";
    man.Person::func2();

  system("pause");

}

结果如下图:
结果

四、总结

  1. 基类与派生类中一般函数同名,调用哪个类的函数与指针的定义类型有关,与指针的指向无关。
  2. 基类与派生类中虚函数同名,与指针指向的类型有关,该指针必须定义为基类类型,否则必须显示转换。

参考:
http://baike.baidu.com/view/161302.htm


转载请注明作者和出处:http://blog.csdn.net/holamirai,未经允许请勿用于商业用途。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值