首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一道笔试题,请问!

2012-03-05 
一道笔试题,请教!!!classA{protected:intm_datapublic:A(intdata0){m_datadata}intGetData(){returndo

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

热点排行