一个早上的笔试题目
10-15 23:59:20
来源:http://www.qz26.com 笔试题目 阅读:8454次
导读:cout<<c.B::doGetData()<<endl; // 直接调用B::doGetData, 返回B::m_data = 1cout<<c.C::doGetData()<<endl; // 直接调用B::doGetData // (因为C没有override doGetData), 结果同上system("PAUSE");return 0;}【dai_weitao】:cout<<c.GetData()<<endl; // 调用B的doGetData, 返回的是C中B对象的data 1cout<<c.A::GetData()<<endl; // 同上cout<<c.B::GetData()<<endl; // 同上cout<<c.C::Ge
一个早上的笔试题目,标签:银行笔试题目,企业笔试题目,http://www.qz26.com
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
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
Tag:笔试题目,银行笔试题目,企业笔试题目,求职笔试面试 - 笔试题目
下一条:公司笔试题目