如何确定C++继承层次中的函数调用
来源:互联网 发布:最好的收音机软件 编辑:程序博客网 时间:2024/06/05 07:54
理解C++中继承层次的关键在于理解如何确定函数调用。确定函数调用遵循以下四个步骤:
(1) 首先确定进行函数调用的对象、引用或指针的静态类型。
(2) 在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关类中找到该名字,则调用是错误的。
(3) 一旦找到了该名字,就进行常规类型检查,查看该函数调用是否合法。
(4) <i>若函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。
<ii>若函数调用不合法,则调用是错误的,且不再像(2)一样循着继承链往上找。
举例一:
#include <iostream>#include <functional>using namespace std;class A{protected:int m_data;public:A(int data = 0){m_data = data;}int GetData(){return doGetData();}virtual int doGetData(){return m_data;}};class B: public A{protected:int m_data;public:B(int data = 1){m_data = data;}int doGetData(){return m_data;}};class C: public B{protected:int m_data;public:C(int data = 2){m_data = data;}};int main(){C c(10);cout<<c.GetData()<<endl; //题1 cout<<c.A::GetData()<<endl; //题2cout<<c.B::GetData()<<endl; //题3cout<<c.C::GetData()<<endl; //题4cout<<c.doGetData()<<endl; //题5cout<<c.A::doGetData()<<endl; //题6cout<<c.B::doGetData()<<endl; //题7cout<<c.C::doGetData()<<endl; //题8return 0;}
构造函数从最上层的基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量。
题1:
静态类型为C类,故在C类中找GetData()函数,C类中没有GetData()函数,由步骤(2),在其直接基类B类中查找,B类中也没有,再在A类中找,在A类中找到,且常规类型检查无误,调用合法,运行之。在其函数体类调用的doGetData()是虚函数,但不是通过引用或指针调用,故没有动态绑定,则由静态类型决定调用哪一个版本的doGetData(),静态类型为C类,C类中没有doGetData(),在其基类B类中找,找到,运行之,返回的是B::m_data,其值为默认实参值1。故本行输出1。
其他题类似,答案为1,1,1,1,1,0,1,1。
- 如何确定C++继承层次中的函数调用
- 理解 C++ 中继承层次的关键在于理解如何确定函数调用
- C++学习笔记之继承层次中的函数调用。
- 继承层次中的函数重载问题
- C/C++: 函数调用, 栈的大小是如何被确定的
- c#继承中的函数调用
- 动态链接如何确定是调用的哪一个函数
- [linux.kernel,c]如何调用内核中的函数
- 继承关系中的构造函数调用
- 继承中的构造函数调用顺序
- 继承中的构造函数调用顺序
- c#继承中的函数调用实例
- jpa中的继承层次结构
- 如何确定函数参数
- 如何调用DLL中的函数
- 如何调用 DLL 中的函数
- 如何调用DLL中的函数
- 如何调用DLL中的函数
- hdu 1002 A + B Problem II (大数相加)
- android 网络请求方式 例子
- 微博发布时间不正确,如何调整?
- 超链接中的javascript:void(0)问题
- linux驱动开发 主设备号与次设备号
- 如何确定C++继承层次中的函数调用
- 黑马程序员——Thread.interrupt()清除线程冻结状态
- 把字符串转换成整数
- C++中的临时变量
- 为什么某些网站有些地方打得开,有些地方打不开?
- 程序员面试宝典中的一个错误 char * b=(char *)&a
- LoadRunner中winsocket协议脚本回放时的mismatch问题处理方法
- 关于Android的Animation使用(XML)
- java 面试题收集