多重继承 c++ 和指针

Multiple inheritance c++ and pointers

本文关键字:指针 c++ 多重继承      更新时间:2023-10-16

具有多重继承

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是一个B因此,当您向上投射指针时,不会发生切片(为什么会这样?(,但指针指向对象的适当部分。一个标准的图表将是smth。喜欢

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

ab都指向各自的子对象。

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

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

第一个C++要求所有指令都以分号 (;( 结尾。

现在回答您的问题:

C 的第一个实例会发生什么?

无。A * a = c;实际上初始化一个指向动态分配的*cC 对象的A *指针。这是一个有效的指针转换,因为 C 是 A 的子类。事实上,这只是多态性的基础。

将 C 与 A 类型的指针相辅相是否对对象进行切片,因此 A 仅指向包含 A 成员的 C 部分?

转换指针时不会发生切片。A a1 = *(static_cast<A *>(c));确实会生成仅包含 A 部分的切片副本。

如果是这样,它怎么知道什么时候登顶?

如何实现细节。编译器可以这样做,因为它是在标准中指定的。常见的实现在对象地址中使用偏移量。

如果 C 包含 A 部分和 B 部分,并且 A 部分从偏移量 0 开始,它如何知道要停止哪个偏移量?

这里又是一个实现细节。但对于常见的实现,A 部分以起始偏移量 + sizeof(A( 结束。

C 辅助到 A 类型的指针是否会对对象进行切片

不。初始化(或赋值,但赋值不是代码所做的(指针对指向的对象没有影响。

所以 A 只指向包含 A 成员的 C 的一部分?

这与切片无关,因为这不会发生,但是是的,a(这是指针变量的名称,而不是A(确实指向C对象中的A子对象。A对象仅包含其自己的成员。

它如何知道要停止哪个偏移?

编译器知道对象需要多大,并决定所有已定义类型的确切大小。由于是编译器做出决定,它当然知道它决定了什么。