Delphi继承疑问:子类是否各自持有父类私有字段的独立副本?
结论判定
你所得出的「Delphi会在每个子类中隐式创建父类私有字段的独立副本」的结论完全错误,你观察到的运行结果是面向对象编程的基础特性,和子类是否复制父类私有字段无关。
现象本质解释
- 你代码中三个变量
vSuper、vOne、vTwo是三个完全独立的类实例,每个实例都会独立持有一份自身所有字段的内存空间,哪怕三个变量都是同一个TSuper类的实例,各自赋值后取值也会互不干扰,这和继承逻辑没有关系。 - 所有继承自
TSuper的子类实例,内存布局中只会包含一份从父类继承而来的FField字段,不会额外生成独立副本,子类的实例内存布局是「父类完整内存结构 + 子类自身新增字段」的组合,这是Delphi类继承的固定规则。 - 你代码中子类的构造函数可以直接访问父类的私有字段
FField,是因为所有类的定义都在同一个单元内:Delphi的成员可见性规则明确规定,private修饰的类成员对同一单元内的所有代码可见,不受继承关系限制。如果将父类和子类拆分到不同单元定义,子类构造函数访问FField会直接编译报错,也进一步证明子类没有独立的FField副本。 - 补充说明:你代码中的子类构造函数没有调用父类构造的
inherited Create;语句,父类构造中给FField赋值为0的逻辑不会执行,你最终拿到的就是子类构造里直接赋值的结果,也验证了你操作的就是实例中从父类继承来的那唯一一份FField字段。
特性可靠性说明
上述行为是Delphi Object Pascal的基础语言规范,从早期Delphi版本到最新的正式版均稳定遵循,完全可以依赖,不存在特定场景下表现不一致的问题。
官方说明查阅路径
相关规则可以在Delphi官方提供的《Object Pascal语言参考》文档中,「类与对象」分类下的「成员可见性」、「类继承」两个小节中查阅到明确描述。
内容的提问来源于stack exchange,提问作者HasDev
相关产品推荐
相关产品推荐

