您的位置:首页 > 其它

Dissecting MFC 阅读笔记 一

2009-01-11 09:45 211 查看
阅读下面一段程序,并写出它的执行结果

#include <iostream.h>
#include <stdio.h>
//成员访问权限和继承控制都是 private ,再加加上 集成的方式是 public ,所以才能访问数据成员
class ClassA
{
public:
int m_data1;
int m_data2;
void func1() { }
void func2() { }
virtual void vfunc1() { }
virtual void vfunc2() { }
};

class ClassB : public ClassA
{
public:
int m_data3;
int m_data2;
void func2() { }
virtual void vfunc1() { }
};

class ClassC : public ClassB
{
public://注意基类的成员并m_data1 并没有被覆盖
int m_data1;
int m_data4;
void func2() { }
virtual void vfunc1() { }
};

void main()
{
cout << sizeof(ClassA) << endl;
cout << sizeof(ClassB) << endl;
cout << sizeof(ClassC) << endl;

ClassA a;
ClassB b;
ClassC c;

b.m_data1 = 1;
b.m_data2 = 2;
b.m_data3 = 3;
c.m_data1 = 11;
c.m_data2 = 22;
c.m_data3 = 33;
c.m_data4 = 44;
c.ClassA::m_data1 = 111;//这里仍然可以出 基类的m_data1 并没有被覆盖

cout << b.m_data1 << endl;
cout << b.m_data2 << endl;
cout << b.m_data3 << endl;
cout << c.m_data1 << endl;
cout << c.m_data2 << endl;
cout << c.m_data3 << endl;
cout << c.m_data4 << endl;
cout << c.ClassA::m_data1 << endl;

cout << &b << endl;
cout << &(b.m_data1) << endl;
cout << &(b.m_data2) << endl;
cout << &(b.m_data3) << endl;
cout << &c << endl;
cout << &(c.m_data1) << endl;
cout << &(c.m_data2) << endl;
cout << &(c.m_data3) << endl;
cout << &(c.m_data4) << endl;
cout << &(c.ClassA::m_data1) << endl;

ClassB* pb = new ClassB;
ClassC* pc = new ClassC;

pb->m_data1 = 1111;
pc->m_data3 = 3333;

cout << (int)*((char*)pb+4) << endl;
cout << (int)*((char*)pc+12) << endl;
}

上面的程序至少说明两点:

1 若派生类中存在与基类同名的数据成员,则在派生类中,基类的数据成员并未被覆盖,而是原封不动的继承到了派生类中

2 对象的内存布局中,数据成员的内存位置,由其在类定义中声明的顺序决定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: