如何确定C++继承层次中的函数调用

2020-09-03 科技 91阅读
在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关类中找到该名字,则调用是错误的。(3)
一旦找到了该名字,就进行常规类型检查,查看该函数调用是否合法。(4)#include 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<cout<cout<cout<cout<cout<cout<cout<构造函数从最上层的基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量。题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。
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com