阅读下面一段程序,并写出它的执行结果
#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 对象的内存布局中,数据成员的内存位置,由其在类定义中声明的顺序决定
本文通过一个C++程序实例,展示了派生类如何继承基类成员,并解释了对象内存布局中数据成员的位置由类定义中的声明顺序决定。
3715

被折叠的 条评论
为什么被折叠?



