一个早上的笔试题目

时间:2022-10-26 22:02:20 笔试题目 我要投稿
  • 相关推荐

一个早上的笔试题目

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;
cout<<c.A::GetData()<<endl;
cout<<c.B::GetData()<<endl;
cout<<c.C::GetData()<<endl;
cout<<c.doGetData()<<endl;
cout<<c.A::doGetData()<<endl;
cout<<c.B::doGetData()<<endl;
cout<<c.C::doGetData()<<endl;

system("PAUSE");

return 0;
}

///////////////////////////////////////////////////////
运行的结果是
1
1
1
1
1
0
1
1
不明所以……
【joyous】:
眼花……

Class C 完全就是障眼的,关键在于 Class B 和 Class A 以及 Class A 内的 virtual int doGetData(); 和 Class B 的 int doGetData() { return m_data; };

【lightnut】:
#include <iostream>
using namespace std;

  class A     
  {   
  protected:
  int m_data;            // A::m_data
  public:     
  A(int data = 0){m_data = data;     }   // A::m_data = data (0)
  int GetData(){return doGetData();}
  virtual   int   doGetData(){  return m_data;}   // A::m_data   
  };     
    
  class B:public   A     
  {     
    protected:
  int m_data;             // B::m_data, 与A::m_data是两个不同的量
  public:     
  B(int data = 1){m_data = data;     }   // B::m_data data (1)  
    
  int doGetData(){  return m_data;}      // B::m_data 
  };  

  class C:public B
    {     
    protected:
  int m_data;            // C::m_data, 与A::m_data, B::m_data都不同
  public:     
  C(int data = 2){m_data = data;     }    // C::m_data = data (2)
  };



int main()
{
C c(10);   // C::m_data = 10;
              // C::B::m_data = 1 (通过B(data=1)得到的默认值)
              // C::B::A::m_data = 0 (通过A(data=0)得到的默认值)

cout<<c.GetData()<<endl;    //==>B::GetData()==>B::doGetData, 
                                     // 返回 B::m_data = 1;
cout<<c.A::GetData()<<endl; //==>A::GetData()==>B::doGetData 
                                     //(因为doGetData()是虚函数), 
                                     // 返回 B::m_data = 1
cout<<c.B::GetData()<<endl; //==>B::GetData==>B::doGetData, 结果同上 1
          cout<<c.C::GetData()<<endl; //==>B::GetData==>B::doGetData, 结果同上
cout<<c.doGetData()<<endl;  //==>B::doGetData, 结果同上

cout<<c.A::doGetData()<<endl;   // 直接调用A::doGetData, 
                                         // doGetData的虚函数特性不起作用, 
                                         //返回A::m_data = 0

cout<<c.B::doGetData()<<endl;   // 直接调用B::doGetData, 返回B::m_data = 1
cout<<c.C::doGetData()<<endl;   // 直接调用B::doGetData 
                                         // (因为C没有override doGetData), 结果同上

system("PAUSE");

return 0;
}


【dai_weitao】:
cout<<c.GetData()<<endl;       // 调用B的doGetData, 返回的是C中B对象的data 1
cout<<c.A::GetData()<<endl;    // 同上
cout<<c.B::GetData()<<endl;    // 同上
cout<<c.C::GetData()<<endl;    // 同上
cout<<c.doGetData()<<endl;     // 同上
cout<<c.A::doGetData()<<endl;  // 调用A的doGetData, 返回的是C中A对象的data 0
cout<<c.B::doGetData()<<endl;  // 同上上
cout<<c.C::doGetData()<<endl;  // 同上

原因是在构造C对象时调用B, A的构造函数.
而A的函数GetData调用自己的虚函数do, B重载了A的虚函数.

C的对象结构由两部分组成:
C::m_data和B类型对象.
B的对象结构由两部分组成:
B::m_data和A类型对象.
A的对象结构由三部分组成:
A::m_data, vptr, vtable

C::m_data = 10.
B::m_data = 1.
A::m_data = 0.
vtable中doGetData指针指向B::doGetData.

所以除了调用A::doGetData, 都会返回B::m_data.

【hamlet0168】:
等我有空给你画张图吧,比较直接……

【ccsuwz】:
哎  不懂 为什么C.GetData()不是调用的A::doGetData();

【Tracy2007】:
C的GetData()是从B里继承来的吧

【Tracy2007】:
纯语法题........

【colorapple】:
多层的虚继承调用的时候,应该是调用离派生类最近的继承类的函数吧 ~~?

【gx_055】:
同意楼上的,是虚继承和派生问题,Visual C++程序设计书上有类似的题目

【gx_055】:
还有就是构造和析构函数问题,差点忘了。

【BEYOND_Q】:
#include <iostream>
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;/*m_data = 0 */}     //接口,如不直接调用,则调用派生类中实现他的函数
 };     
    
 class B:public   A     
 {     
  protected:
  int m_data;
  public:     
  B(int data = 1){m_data = data;  }
  //这里 A 中的m_data = 0 ,B中的m_data = 1
    
  int doGetData(){  return m_data ;/*m_data = 1 */}   //实现接口  
};  

class C:public B //C继承了A&B类的方法&属性,且未从新定义接口,故接口还是B类中定义的
{     
  protected:
  int m_data;
  public:     
  C(int data = 2){m_data = data;  }
  //这里 A 中的m_data = 0 ,B中的m_data = 1,C 类中的m_data = 2
};


int main()
{
C c(10);

cout<<c.GetData()<<endl;
//本来是要调用C类的GetData(),C中未定义,故调用B中的,但是B中未定义,故调用A中的GetData(),因为A中的doGetData()是虚函数,所以调用
//B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.A::GetData()<<endl;
//因为A中的doGetData()是虚函数,又因为C类中未重定义该接口,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.B::GetData()<<endl;
//肯定返回 1 了
cout<<c.C::GetData()<<endl;
//因为C类中未重定义GetData(),故调用从B继承来的GetData(),但是B类也未定义,所以调用A中的GetData(),因为A中的doGetData()是虚函数,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.doGetData()<<endl;
//肯定是B类的返回值 1 了
cout<<c.A::doGetData()<<endl;
//因为直接调用了A的doGetData(),所以输出 0 了
cout<<c.B::doGetData()<<endl;
//因为直接调用了B的doGetData(),所以输出 1 了
cout<<c.C::doGetData()<<endl;
//因为C类中未重定义该接口,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
system("PAUSE");

return 0;
}
//这个程序已经通过VC++6.0的测试,且与解释的输出结果一致
//希望大家能够明白,谢谢了
//如果有错,还请大家批评指正啊,共同进步嘛!呵呵

【lyxfzl】:
构造函数从最基类的开始构造,各个类的同名变量没有形成覆盖,都是单独的变量.理解这两个重要的C++特性后解决这个问题就比较轻松了.!!!C++有时候很迷糊人的!

【jianxin33333】:
BEYOND_Q() 说的很明白,我也懂了,十分感谢

【g012345678】:
懂一点点


先科数据(虚拟主机) 打造诚信第一品牌 
提供预先免费测试10天 
http://www.dataweb.cn 
QQ:42836192

【haohuilai】:
mark

【一个早上的笔试题目】相关文章:

笔试题目11-06

城管笔试题目06-05

驾照笔试题目12-11

微软笔试题目03-16

雅虎笔试题目12-12

宜家笔试题目12-12

机械笔试题目12-12

Google笔试题目12-14

诺基亚笔试题目12-11

华夏的笔试题目11-21