MST

星途 面试题库

面试题:C++空类继承体系下sizeof值及内存布局变化

假设有一个空类`Base`,另一个类`Derived`继承自`Base`,即`class Base {}; class Derived : public Base {};`,分析`sizeof(Base)`和`sizeof(Derived)`的值,详细说明继承关系对空类内存布局产生的影响,以及这种影响在实际编程中的意义。
40.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. sizeof(Base)的值
    • 在C++中,空类Base的大小为1字节。这是因为C++标准规定,每个实例化的对象都必须有独一无二的地址,即使是空类,也需要占用一定的空间来保证这个地址的唯一性。所以sizeof(Base) == 1
  2. sizeof(Derived)的值
    • 由于Derived类继承自Base类,Derived类的对象除了自身可能有的成员(在本题中Derived类也为空类),还包含从Base类继承来的部分。因为Base类为空类占1字节,Derived类自身也没有额外成员,所以sizeof(Derived) == 1
  3. 继承关系对空类内存布局产生的影响
    • 当一个空类Derived继承自另一个空类Base时,Derived类的对象在内存中的布局包含了从Base类继承来的部分。虽然Base类和Derived类都没有数据成员,但为了保证对象的唯一性和地址的区分,每个类对象都至少占1字节。从内存布局角度看,Derived对象的内存空间中至少有1字节用于标识其从Base类继承的部分(即使这部分没有实际数据)。
  4. 这种影响在实际编程中的意义
    • 对象唯一性:确保每个对象都有唯一的内存地址,这在很多情况下是必要的,比如在多态性的实现中,通过对象的地址来区分不同的对象实例,即使是空类对象也需要遵循这个规则。
    • 兼容性:在继承体系中,子类对象包含父类对象的部分,这种内存布局方式保证了代码在不同编译器和平台之间的兼容性,使得基于继承的多态、动态绑定等特性能够正确实现。例如,在使用指向父类的指针或引用操作子类对象时,编译器能够根据这种内存布局准确地访问到对象的各个部分。