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

发布于:2021-07-21 21:20:36

一、普通函数同名:

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


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


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


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

#include
using namespace std;

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


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

void main( int, char** argv )
{

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

//基类和派生类非虚函数同名
cout<<"******** 基类和派生类函数同名 ************"< 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<
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<
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");

}

结果如下图:


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

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



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

相关推荐

最新更新

猜你喜欢