首页 > 就业 > 笔试

今天的一个笔试题目

今天的一个笔试题目



今天的一个笔试题目

#include
usingnamespacestd;

classA
{
protected:
intm_data;
public:
A(intdata=0){m_data=data;}
intGetData(){returndoGetData();}
virtualintdoGetData(){returnm_data;}
};

classB:publicA
{
protected:
intm_data;
public:
B(intdata=1){m_data=data;}

intdoGetData(){returnm_data;}
};

classC:publicB
{
protected:
intm_data;
public:
C(intdata=2){m_data=data;}
};



intmain()
{
Cc(10);

cout<cout<cout<cout<cout<cout<cout<cout<
system("PAUSE");

return0;
}

///////////////////////////////////////////////////////
运行的结果是
1
1
1
1
1
0
1
1
不明所以……

内容回答

眼花……

ClassC完全就是障眼的,关键在于ClassB和ClassA以及ClassA内的virtualintdoGetData();和ClassB的intdoGetData(){returnm_data;};

【lightnut】:
#include
usingnamespacestd;

classA
{
protected:
intm_data;//A::m_data
public:
A(intdata=0){m_data=data;}//A::m_data=data(0)
intGetData(){returndoGetData();}
virtualintdoGetData(){returnm_data;}//A::m_data
};

classB:publicA
{
protected:
intm_data;//B::m_data,与A::m_data是两个不同的量
public:
B(intdata=1){m_data=data;}//B::m_datadata(1)

intdoGetData(){returnm_data;}//B::m_data
};

classC:publicB
{
protected:
intm_data;//C::m_data,与A::m_data,B::m_data都不同
public:
C(intdata=2){m_data=data;}//C::m_data=data(2)
};



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

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

cout<//doGetData的虚函数特性不起作用,
//返回A::m_data=0

cout<cout<//(因为C没有overridedoGetData),结果同上

system("PAUSE");

return0;
}


【dai_weitao】:
cout<cout<cout<cout<cout<cout<cout<cout<
原因是在构造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】:
同意楼上的,是虚继承和派生问题,VisualC++程序设计书上有类似的题目

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

【BEYOND_Q】:
#include
usingnamespacestd;

classA
{
protected:
intm_data;
public:
A(intdata=0){m_data=data;}
intGetData(){returndoGetData();}
virtualintdoGetData(){returnm_data;/*m_data=0*/}//接口,如不直接调用,则调用派生类中实现他的函数
};

classB:publicA
{
protected:
intm_data;
public:
B(intdata=1){m_data=data;}
//这里A中的m_data=0,B中的m_data=1

intdoGetData(){returnm_data;/*m_data=1*/}//实现接口
};

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


intmain()
{
Cc(10);

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

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

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

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

【g012345678】:
懂一点点

相关内容

热门阅读
随机推荐