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 对象的内存布局中,数据成员的内存位置,由其在类定义中声明的顺序决定
#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 对象的内存布局中,数据成员的内存位置,由其在类定义中声明的顺序决定
相关文章推荐
- Dessecting MFC 阅读笔记(三)
- Dessecting MFC 阅读笔记 六
- 基于mfc的pc客户端源码阅读笔记
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---BeautifulSoup---findAll
- Tinyhttpd阅读笔记
- 阅读笔记02
- 学习笔记之深入浅出MFC 第9章 仿真MFC之二
- 《操作系统真象还原》-阅读笔记(上)
- 梦断代码阅读笔记一(0-3章)
- 阅读Fragment源码笔记
- 【搜索引擎Jediael开发笔记2】使用HttpClient下载网页至本地文件 分类: C_OHTERS 2014-05-19 15:07 1108人阅读 评论(0) 收藏
- MFC学习笔记之ClassWizard
- 《大型网站技术架构》阅读笔记01
- 孙鑫VC++视频学习笔记之2: MFC程序框架的剖析
- kmemcache源代码阅读笔记
- Introducing Go - O'Reilly 2016 阅读笔记
- Effective C++阅读笔记
- [Photon] Lite Application 源码阅读笔记
- Mysql源代码阅读笔记(一) 系统变量和系统状态变量
- Learning the parts of objects bynon-negative matrix factorization阅读笔记