今天的一个笔试题目
#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<
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::m_data=1;
cout<
//(因为doGetData()是虚函数),
//返回B::m_data=1
cout<
cout<
cout<
cout<
//返回A::m_data=0
cout<
system("PAUSE");
return0;
}
【dai_weitao】:
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<
//B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出1
cout<
cout<
cout<
cout<
cout<
cout<
cout<
system("PAUSE");
return0;
}
//这个程序已经通过VC++6.0的测试,且与解释的输出结果一致
//希望大家能够明白,谢谢了
//如果有错,还请大家批评指正啊,共同进步嘛!呵呵
【lyxfzl】:
构造函数从最基类的开始构造,各个类的同名变量没有形成覆盖,都是单独的变量.理解这两个重要的C++特性后解决这个问题就比较轻松了.!!!C++有时候很迷糊人的!
【jianxin33333】:
BEYOND_Q()说的很明白,我也懂了,十分感谢
【g012345678】:
懂一点点
版权声明:此文自动收集于网络,若有来源错误或者侵犯您的合法权益,您可通过邮箱与我们取得联系,我们将及时进行处理。
本文地址:https://www.gunzhua.com/jiuye/bishi/84727.html