c++ - 多重继承 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
,作为两者的孩子,是 a A
并且是 a B
。因此,当您向上转换指针时,不会发生切片(为什么会这样?),但指针指向对象的适当部分。一个标准的图表将是smth。喜欢
c -> +++++++++++++++++++++
+ C +
a -> + +++++++++++++++++ +
+ + A + +
+ +++++++++++++++++ +
+ +
b -> + +++++++++++++++++ +
+ + B + +
+ +++++++++++++++++ +
+ +
+ C's own members +
+ +
+++++++++++++++++++++
两者都a
指向b
各自的子对象。
它是怎么知道的?— 好吧,编译器创建内存布局,它肯定知道应该将指针分配给哪些虚拟地址,以及向上/向下转换如何相当于指针偏移量。
请注意,当您使用指向基址的普通指针作为对对象的唯一(和拥有)引用时,您应该声明基址的析构函数virtual
,否则您将无法正确销毁该对象。
推荐阅读
- python - 如何使用重复索引进行数据透视表
- datetime - 在 Flutter / Dart 中获取上个月的日期
- json - 当您将标志“?debugmode = false”附加到Web url的末尾时,它会做什么
- javascript - Mobx 反应表单自定义 DVR 规则
- sql - Oracle 生成数据
- ansible - ansible:如何通过字母数字键/索引/哈希访问 yaml 定义的数组
- gitlab - 如何列出组中的已归档项目?
- r - 使用 R 和正则表达式将第一个逗号替换为分号字符串
- ssis - 如何映射从我的数据库中的表而不是从 SSIS 包中的文件中获取平面文件数据的列?
- sql - SQL:如果变量为 NULL 时不使用 LIKE