据我所知,我们可以使用基类指针来寻址和调用派生类中的虚函数,因为基类指针的指针范围更有限。但我只想知道,基类指针如何知道派生类从哪里开始?
例如,对于记录 A、B、C 都有自己的数据成员,我们可以分两种不同的类别讨论这个问题 1. A、B 和 C 都有自己的虚函数; 2. A、B&C只有自己的数据成员,没有任何虚函数
class A {...};
class B {...};
class C : public A, public B {...};
C c;
B* b = &c
在 C 内部,A 应该放在 B 的顶部,那么指针 b 是如何知道在 C 中从哪里开始寻址的呢?
最佳答案
编译器知道布局,所以它会发出代码,计算B
的地址。 C
中的子对象.
让我们看一个简单的实际示例:
class A { int x; };
class B { int y; };
class C: public A, public B { };
B *get(C &c) {
return &c;
}
在
get
,编译器必须计算B
居住在 C
.这是编译代码的示例( godbolt ):get(C&): # @get(C&)
lea rax, [rdi + 4]
ret
这意味着编译器会将 4 个字节添加到输入参数的地址(
c
)并返回(它添加 4,因为 sizeof(A)
是 4,并且编译器决定不添加任何额外的填充)。请注意,如果
A
为空,那么很可能B
的地址与 C
相同.如果 A
不为空(具有非静态数据成员,或具有虚函数),则 B
的地址可能会有所不同。但所有这些都是实现细节,取决于平台 ABI(应用程序二进制接口(interface))。
关于c++ - 派生类中的基指针地址如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61558931/