gpt4 book ai didi

c++ - 派生类中的基指针地址如何?

转载 作者:行者123 更新时间:2023-12-02 10:17:09 24 4
gpt4 key购买 nike

据我所知,我们可以使用基类指针来寻址和调用派生类中的虚函数,因为基类指针的指针范围更有限。但我只想知道,基类指针如何知道派生类从哪里开始?

例如,对于记录 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com