多重继承 c++ 和指针
Multiple inheritance c++ and pointers
具有多重继承
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 +
+ +
+++++++++++++++++++++
a
和b
都指向各自的子对象。
它怎么知道?——编译器创建内存布局,它肯定知道应该将指针分配给哪些虚拟地址,以及向上/向下转换如何构成指针偏移量。
请注意,当您使用指向 base 的普通指针作为对对象的唯一(和拥有(引用时,您应该声明 base 的析构函数virtual
,否则您将无法正确销毁对象。
第一个C++要求所有指令都以分号 (;
( 结尾。
现在回答您的问题:
C 的第一个实例会发生什么?
无。A * a = c;
实际上初始化一个指向动态分配的*c
C 对象的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
对象仅包含其自己的成员。
它如何知道要停止哪个偏移?
编译器知道对象需要多大,并决定所有已定义类型的确切大小。由于是编译器做出决定,它当然知道它决定了什么。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错