名字查找与继承(函数调用的确认)
2013-11-02 18:43
447 查看
理解 C++ 中继承层次的关键在于理解如何确定函数调用。确定函数调用遵循以下四个步骤:
1. 首先确定进行函数调用的对象、引用或指针的静态类型。2. 在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字则调用是错误的。
3. 一旦找到了该名字,就进行常规类型检查,查看如果给定找到的定义,该函数调用是否合法。
4. 假定函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。
例如:
已经知道 net_price(int)函数是基类base 中定义的虚函数
Bulk_item bulk;
Item_base item(bulk);
Item_base *p = &bulk;
p->net_price(10);
调用 net_price 的 Bulk_item 实例因为:对于虚函数而言,通过指向基类对象的指针(引用)进行动态绑定;即调用该指针实际指向的对象所属类型中定义的函数。
item.net_price(10);
调用 Item_base 实例;因为通过对象调用虚函数,所调用到的总是该对象所属类型中定义的函数。
相关文章推荐
- C++之:函数调用的名字查找与继承
- C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
- 父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.
- 继承层次中 this,名字查找 导致的成员调用问题
- 继承关系中的函数调用
- eclipse中查找函数的所有调用
- 小探多继承模式下虚函数的调用
- 【转】doxygen+graphviz生成工程中的类继承树及函数调用图
- 透过汇编另眼看世界之多继承下的虚函数函数调用
- Xcode查找函数调用以及被调用的地方
- Source Insight快速查找变量被哪些函数调用的情况
- 函数调用时形参的传递也会被认为是赋值操作(继承自Object后会出现的问题)
- java类继承中父类调用子类函数的问题
- 在vim中使用cscope查找调用、定义函数和变量的地方
- 虚函数 多重继承的构造函数的调用,虚函数地址的找法
- C++在多层继承中调用虚函数
- c#继承中的函数调用
- sourceInsight 查找某个变量或函数 调用了谁,或者被谁调用了
- 关于c++多重继承下的函数调用注意的问题
- 关于virtual、非virtual继承函数的调用