Key Concept: Name Lookup and Inheritance
Understanding how function calls are resolved is crucial to understanding
inheritance in C++. Given the call p->mem() (or obj.mem()), the following four
steps happen:
• First determine the static type of p (or obj). Because we’re calling a
member, that type must be a class type.
• Look for mem in the class that corresponds to the static type of p (or obj).
If mem is not found, look in the direct base class and continue up the chain
of classes until mem is found or the last class is searched. If mem is not
found in the class or its enclosing base classes, then the call will not
compile.
• Once mem is found, do normal type checking (§6.1, p. 203) to see if this
call is legal given the definition that was found.
• Assuming the call is legal, the compiler generates code, which varies
depending on whether the call is virtual or not:
– If mem is virtual and the call is made through a reference or pointer, then
the compiler generates code to determine at run time which version to run
based on the dynamic type of the object.
– Otherwise, if the function is nonvirtual, or if the call is on an object (not a
reference or pointer), the compiler generates a normal function call.
Understanding how function calls are resolved is crucial to understanding
inheritance in C++. Given the call p->mem() (or obj.mem()), the following four
steps happen:
• First determine the static type of p (or obj). Because we’re calling a
member, that type must be a class type.
• Look for mem in the class that corresponds to the static type of p (or obj).
If mem is not found, look in the direct base class and continue up the chain
of classes until mem is found or the last class is searched. If mem is not
found in the class or its enclosing base classes, then the call will not
compile.
• Once mem is found, do normal type checking (§6.1, p. 203) to see if this
call is legal given the definition that was found.
• Assuming the call is legal, the compiler generates code, which varies
depending on whether the call is virtual or not:
– If mem is virtual and the call is made through a reference or pointer, then
the compiler generates code to determine at run time which version to run
based on the dynamic type of the object.
– Otherwise, if the function is nonvirtual, or if the call is on an object (not a
reference or pointer), the compiler generates a normal function call.
本文探讨了C++中如何解析函数调用及其与继承的关系。通过四个步骤详细解释了如何确定成员函数的位置:确定指针或对象的静态类型;在对应类中查找成员函数;进行类型检查;生成调用代码。
221

被折叠的 条评论
为什么被折叠?



