父类和派生的子类存在同一个成员变量名,是如何分配内存空间的?
在vs编译器中可以将源文件配置好后,看到内存布局:具体方法就是在vs的c++项目的属性中,添加/d1 reportAllClassLayout,注意添加到C/C++项目下的命令行中,不要放在链接器下的命令行中,否则会报错而且看不到内存布局。
这样上面这个问题就可以直接看到了:
#include "stdafx.h"
class Base
{
int a;
int b;
public:
void CommonFunction();
};
class derived: public Base
{
private:
int a;
};
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
结果如下:
1> testCppClass.cpp
1> class Base size(8):
1> +---
1> 0 | a
1> 4 | b
1> +---
1>
1>
1>
1> class derived size(12):
1> +---
1> | +--- (base class Base)
1> 0 | | a
1> 4 | | b
1> | +---
1> 8 | a
1> +---
1>
1>
1>
1>Manifest:
1> 正在删除文件“Debug\testCppClass.exe.embed.manifest”。
1>LinkEmbedManifest:
1> testCppClass.vcxproj -> D:\Users\Documents\Visual Studio 2010\Projects\testCppClass\Debug\testCppClass.exe
1>FinalizeBuildStatus:
1> 正在删除文件“Debug\testCppClass.unsuccessfulbuild”。
1> 正在对“Debug\testCppClass.lastbuildstate”执行 Touch 任务。
1>
1>生成成功。
1>
1>已用时间 00:00:01.97
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
可以看的很清楚派生类中并没有对父类中的属性进行覆盖,所以只要使用的仍然是父类指针,而不是子类的虚表指针,在子类中仍然能够对两个相同的名称的不同成员变量进行访问。