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

来源:互联网 发布:社交软件源码 编辑:程序博客网 时间:2024/05/17 22:15

一、普通函数同名:

当某个函数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,未经允许请勿用于商业用途。

0 0