c++继承的内存模型
时间: 2025-01-01 20:28:32 浏览: 39
### C++ 中继承相关的内存布局和模型
#### 虚继承下的类 `B` 和派生类 `B1`
在C++中,当涉及到虚继承时,编译器会采取特殊措施来确保基类子对象仅存在一次。对于给定的代码片段:
```cpp
class B {
public:
int ib;
public:
B(int i = 1) :ib(i) {}
virtual void f() { std::cout << "B::f()"; }
virtual void Bf() { std::cout << "B::Bf()"; }
};
class B1 : virtual public B {
public:
int ib1;
public:
B1(int i = 100) :ib1(i), B(i) {} // 明确调用基类构造函数
virtual void f() override { std::cout << "B1::f()"; }
virtual void f1() { std::cout << "B1::f1()"; }
virtual void Bf1() { std::cout << "B1::Bf1()"; }
};
```
#### 内存布局分析
- **类 `B` 的内存结构**
类 `B` 包含一个整型成员变量 `ib` 和两个虚函数表指针(vptr)。由于 `B` 是被虚继承的基础类,在任何最终派生类的对象创建之前不会分配其空间。
- **类 `B1` 的内存结构**
当定义了一个从 `B` 虚继承而来的类 `B1` 后,该类实例化后的内存布局如下:
- 首先是一个指向虚函数表的指针 vptr。
- 接着是派生类特有的数据成员 `ib1`。
- 最后才是由虚继承引入的基础部分——即基础类 `B` 的成员 `ib` 及其自身的 vptr[^1]。
这种设计使得即使有多个间接路径通往同一个虚拟基类,也只会有一个实际存在的副本存在于最底层的对象里。
#### 复杂情况说明
如果还有其他类继续从 `B1` 或者直接通过不同的路径再次虚继承自 `B` ,那么这些新加入的层次同样遵循上述原则构建自己的内部表示形式;同时为了支持动态绑定机制正常工作,每一个涉及多态特性的类都会拥有独立设置好的虚函数表。
阅读全文
相关推荐


















