读书人

一道笔试题,请问!

发布时间: 2012-03-05 11:54:02 作者: rapoo

一道笔试题,请教!!!
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

读书人网 >C++

热点推荐