首页 > 解决方案 > 多重继承 C++ 和指针

问题描述

多重继承

class A{};
class B{};

class C: public A, public B{};

当我这样做时会发生什么

C *c = new C;
A *a = c;  
B *b = c;

A *a1 = new C;
B *b1 = new C;

C 的第一个实例会发生什么?将 C 分配给 A 类型的指针是否对对象进行切片,因此 A 仅指向包含 A 成员的 C 的一部分?如果是这样,它如何知道何时达到顶峰?如果 C 包含 A 部分和 B 部分,并且 A 部分从偏移量 0 开始,它如何知道要停止哪个偏移量?

感谢帮助。

标签: c++pointersinheritance

解决方案


C,作为两者的孩子,是 a A并且是 a B。因此,当您向上转换指针时,不会发生切片(为什么会这样?),但指针指向对象的适当部分。一个标准的图表将是smth。喜欢

 c -> +++++++++++++++++++++
      +        C          +
 a -> + +++++++++++++++++ +
      + +      A        + +
      + +++++++++++++++++ +
      +                   +
 b -> + +++++++++++++++++ +
      + +      B        + +
      + +++++++++++++++++ +
      +                   +
      +  C's own members  +
      +                   +
      +++++++++++++++++++++

两者都a指向b各自的子对象。

它是怎么知道的?— 好吧,编译器创建内存布局,它肯定知道应该将指针分配给哪些虚拟地址,以及向上/向下转换如何相当于指针偏移量。

请注意,当您使用指向基址的普通指针作为对对象的唯一(和拥有)引用时,您应该声明基址的析构函数virtual,否则您将无法正确销毁该对象。


推荐阅读