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

标签 c++ pointers inheritance memory

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

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

相关文章:

c++ - 使用 lambda 的 Boost 算法无法编译

c++ - 在 QSplitter 中使用 QScrollArea 时的初始窗口大小稍微太小,导致滚动条出现

C++在函数中分配动态内存 - 新手问题

pointers - 解码嵌套结构和类型断言

c++ - 嵌入式软件上的 Unicode 字符串

c++ - 语法分解问题

C++ 指针和类

c++ - 错误说定义为公共(public)的类是私有(private)的

C++从已经初始化的父类创建子类

c# - 奇怪的继承修改