一、普通函数同名:
当某个函数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<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");
}
结果如下图:
四、总结
- 基类与派生类中一般函数同名,调用哪个类的函数与指针的定义类型有关,与指针的指向无关。
- 基类与派生类中虚函数同名,与指针指向的类型有关,该指针必须定义为基类类型,否则必须显示转换。
参考:
http://baike.baidu.com/view/161302.htm
转载请注明作者和出处:http://blog.csdn.net/holamirai,未经允许请勿用于商业用途。