C++继承时派生类与基类有同名函数时如何分别引用
来源:互联网 发布:社交软件源码 编辑:程序博客网 时间:2024/05/17 22:15
一、普通函数同名:
当某个函数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,未经允许请勿用于商业用途。
0 0
- C++继承时派生类与基类有同名函数时如何分别引用
- C++: 继承与派生
- 继承与派生(C++)
- C++:继承与派生
- 假设派生类继承自两个基类,而两个基类中有同名虚函数,问虚表
- 继承与派生:派生类的构造函数
- 继承与派生:派生类的析构函数
- 继承与派生:虚基类及其派生类的构造函数
- 三十九、继承与派生:派生类的构造函数****
- 四十、继承与派生:派生类的析构函数
- C++:类继承、兼容性原则、初始化列表、同名函数
- C++(继承时的名字遮蔽&&派生类的构造函数)
- C++继承基类与子类中的同名变量与同名函数
- 7.26派生类成员函数与基类成员函数同名
- C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数
- C++_继承与派生
- C++_继承与派生
- C++_继承与派生
- Add Again(重复元素排序)
- 带外数据OOB与紧急模式URG
- JavaScript实现禁用键盘和鼠标的点击事件
- hdu 5234 Happy birthday(格子图上的01背包)
- ListView 的标准写法
- C++继承时派生类与基类有同名函数时如何分别引用
- LeetCode——Palindrome Number
- 自己动手解Json!(IOS利用分治法解析Json)(一)
- Eclipse里面找不到DatabaseExplorer,怎么办?
- 文件上传与下载(二)smartupload
- xml 配置说明
- 慢一点,再慢一点
- jquery mobile的tap()事件以及jQuery事件的delegate()方法
- python及hadoop学习网址