父类和子类中存在同一个成员变量

父类和派生的子类存在同一个成员变量名,是如何分配内存空间的?
在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 个 ==========

可以看的很清楚派生类中并没有对父类中的属性进行覆盖,所以只要使用的仍然是父类指针,而不是子类的虚表指针,在子类中仍然能够对两个相同的名称的不同成员变量进行访问。

你可能感兴趣的:(C/C++)