一道笔试题,请教!!!
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
{
public:
C(int data = 2){m_data = data;}
};
int main()
{
C c(10);
cout < < c.GetData() < < endl
< < c.doGetData() < < endl
< < c.A::GetData() < < endl
< < c.A::doGetData() < < endl;
return 0;
}
输出是10
10
10
0
请教为什么会这么输出?
[解决办法]
int GetData(){return doGetData();}
这个函数做为一个非虚函数接口(NVI)来实现动态绑定.
1.C c(10);
B里的m_data赋为了10,而A里的m_data是0
2.c.GetData()
调用NVI函数,此函数调用虚函数doGetData(),寻找调用着类型的doGetData()函数,即B类
的doGetData(),故输出10;
3.c.doGetData()
B类里的c.doGetData() 掩盖了A类里的c.doGetData() ,所以调用的仍是B类的c.doGetData
(),因此仍输出10
4. c.A::GetData()
A::GetData() 本身并非虚函数,所以这种做法并不能改变NVI,故和第2种情况一样.10
5.c.A::doGetData()
在作用域标识符的作用下,调用A类的doGetData()函数,故输出为0