C++中名字查找与继承

C++中名字查找与继承

ID:37909733

大小:28.00 KB

页数:5页

时间:2019-06-02

C++中名字查找与继承_第1页
C++中名字查找与继承_第2页
C++中名字查找与继承_第3页
C++中名字查找与继承_第4页
C++中名字查找与继承_第5页
资源描述:

《C++中名字查找与继承》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++调用成员函数的步骤一般为:(1)首先确定函数调用的对象、引用或指针的静态类型。(2)在该类中查找函数,如果找不到就在直接基类中找,如此循环直到查找到最上层基类。(3)一旦找到了改名字就进行常规的参数类型检查。(4)假定函数调用是合法的,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定对象的动态类型运行哪个函数版本。注意:名字查找发生在编译期(即使是虚函数调用),而且与参数检查是不同阶段。如:classBase{public:voidfun(){}};classDerived:publicBase{p

2、ublic:voidfun(inta){}};Derivedd;d.fun();//调用出错,因为编译器首先找到的是Derived中的fun,所以不在查找,但是参数检查时发现类型不匹配。对于通过基类指针或引用调用虚函数,同样编译器要在基类中查找函数名称,假定找到了函数名称,编译器就检查实参与形参是否匹配。这就是为什么虚函数必须在基类和派生类中拥有同一原型了。名字冲突造成的覆盖问题原则:如果基类和派生类使用相同名字的成员函数,在派生类作用域中派生类成员将屏蔽基类成员,即使函数原型不同,基类成员也会被屏蔽。如:classBase{publ

3、ic:virtualvoidfun(){cout<<"Base::fun()"<

4、un(int)"<fun();//Base::fun()pb2->fun();//Base::fun()pb3->fun();//Derived2::fun()下面分析两个经典面试题。l例1:classA{protected:intm_data;public:A(intdata=0){m

5、_data=data;}intGetData(){returndoGetData();}virtualintdoGetData(){returnm_data;}};classB:publicA{protected:intm_data;public:B(intdata=1){m_data=data;}intdoGetData(){returnm_data;}};classC:publicB{protected:intm_data;public:C(intdata=2){m_data=data;}};int_tmain(intargc,_

6、TCHAR*argv[]){Cc(10);cout<

7、;}分析:c.GetData(),首先在C的作用域中查找GetData,没有找到,然后再B中查找,依然没有,最后在A中查找,找到了这个函数。之后参数检查没发生错误则生成调用代码。注意在GetData(成员函数)中调用了doGetData(虚函数)。其实GetData的原型应该是:intGetData(A*this){returnthis->doGetData();}这里通过指针调用虚函数,会发生动态绑定。因为this指向的c(派生类对象),所以要调用C中的虚函数doGetData。那C中有没有这个函数呢?虽然直接没有,但是别忘了C中有

8、继承自B中的虚函数表,也就是调用B中的这个doGetData。之后的c.B::GetData()、c.C::GetData()、c.A::GetData()其实都一样,因为B、C中都没有GetData,所以都是调用的A中

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。