MST

星途 面试题库

面试题:C++ 中虚基类如何影响派生类内存大小

请简述在 C++ 中,虚基类是怎样改变派生类内存大小的?给出一个简单的代码示例来说明虚基类对派生类内存布局的影响。
33.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 虚基类对派生类内存大小的改变原理
    • 当一个类有虚基类时,派生类会额外增加一些空间来存储虚基类的偏移信息(通常是一个指针)。这是因为虚基类的存在使得多重继承的内存布局变得更加复杂,为了能够正确地访问虚基类的成员,需要通过这个偏移信息来定位虚基类子对象在派生类对象内存中的位置。
    • 普通继承中,派生类对象内存布局是按照继承体系顺序依次排列基类子对象和自身成员。而虚基类的引入打破了这种简单的线性排列,使得派生类对象内存布局需要特殊的机制来处理虚基类子对象的位置。
  2. 代码示例
#include <iostream>

// 虚基类
class Base {
public:
    int data;
};

// 派生类1,继承自Base
class Derived1 : virtual public Base {
public:
    int derived1Data;
};

// 派生类2,继承自Base
class Derived2 : virtual public Base {
public:
    int derived2Data;
};

// 最终派生类,多重继承自Derived1和Derived2
class FinalDerived : public Derived1, public Derived2 {
public:
    int finalDerivedData;
};

int main() {
    std::cout << "Size of Base: " << sizeof(Base) << " bytes" << std::endl;
    std::cout << "Size of Derived1: " << sizeof(Derived1) << " bytes" << std::endl;
    std::cout << "Size of Derived2: " << sizeof(Derived2) << " bytes" << std::endl;
    std::cout << "Size of FinalDerived: " << sizeof(FinalDerived) << " bytes" << std::endl;
    return 0;
}

在这个示例中:

  • Base类只有一个int成员,所以sizeof(Base)通常为4字节(假设int为4字节)。
  • Derived1Derived2类都以虚继承的方式继承Base类,它们除了自身的int成员derived1Dataderived2Data外,还需要额外空间存储指向虚基类Base子对象的偏移信息(通常是一个指针,假设指针为8字节),所以sizeof(Derived1)sizeof(Derived2)一般会比Base类的大小加上自身int成员的大小要大(假设int为4字节,在64位系统下通常为16字节)。
  • FinalDerived类多重继承自Derived1Derived2,虽然Derived1Derived2都继承自Base,但由于虚基类的机制,FinalDerived中只有一份Base子对象。FinalDerived的大小除了自身的int成员finalDerivedData,还包含Derived1Derived2中的偏移信息以及Base子对象等,在64位系统下通常为32字节。通过运行程序输出的大小,可以直观看到虚基类对派生类内存布局的影响。