面试题答案
一键面试- 虚基类对派生类内存大小的改变原理:
- 当一个类有虚基类时,派生类会额外增加一些空间来存储虚基类的偏移信息(通常是一个指针)。这是因为虚基类的存在使得多重继承的内存布局变得更加复杂,为了能够正确地访问虚基类的成员,需要通过这个偏移信息来定位虚基类子对象在派生类对象内存中的位置。
- 普通继承中,派生类对象内存布局是按照继承体系顺序依次排列基类子对象和自身成员。而虚基类的引入打破了这种简单的线性排列,使得派生类对象内存布局需要特殊的机制来处理虚基类子对象的位置。
- 代码示例:
#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字节)。Derived1
和Derived2
类都以虚继承的方式继承Base
类,它们除了自身的int
成员derived1Data
或derived2Data
外,还需要额外空间存储指向虚基类Base
子对象的偏移信息(通常是一个指针,假设指针为8字节),所以sizeof(Derived1)
和sizeof(Derived2)
一般会比Base
类的大小加上自身int
成员的大小要大(假设int
为4字节,在64位系统下通常为16字节)。FinalDerived
类多重继承自Derived1
和Derived2
,虽然Derived1
和Derived2
都继承自Base
,但由于虚基类的机制,FinalDerived
中只有一份Base
子对象。FinalDerived
的大小除了自身的int
成员finalDerivedData
,还包含Derived1
和Derived2
中的偏移信息以及Base
子对象等,在64位系统下通常为32字节。通过运行程序输出的大小,可以直观看到虚基类对派生类内存布局的影响。