c++ - C++中成员查找的过程是如何发生的?

标签 c++ name-lookup

我正在使用文档号 4901,C++ Draft ISO 2021,特别是 6.5.2(成员名称查找)。我无法理解术语“成员子对象”和“基类子对象”的很多用法。我已经在:What is a member sub object? 中询问过这些术语。和 What is a base class subobject

第二个问题的答案对我来说比较满意,但第一个问题对我没有帮助。我觉得草案中的解释有点太抽象了,所以我会依赖上面引用的术语的严格定义,但确实没有找到任何定义。另辟蹊径,成员姓名查找在实践中是如何发生的?术语:成员子对象基类子对象与成员名称查找有何关系?

最佳答案

从 ABI 的角度来看,BC 在以下方面几乎没有区别:

struct A {
  int x;
};

struct B : A {};

struct C {
  A base;
};

创建B类型的对象或C类型的对象都需要创建A类型的对象。在这两种情况下,A 的实例都属于父对象。因此,在这两种情况下,它们都是子对象

对于 B 类型的对象,A 对象是基类子对象

对于C类型的对象,A对象是一个成员子对象

编辑:整合评论中后续问题的内容。

struct D : A {
  A base;
};

D 的例子中,D 的每个实例中有 2 个 A 类型的子对象。一个基类子对象一个成员子对象

关于c++ - C++中成员查找的过程是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69756347/

相关文章:

c++ - 重写非常量虚方法是否隐藏了常量重载?

c# - 在 C# 中将字符串转换为字节数组以在 C++ 中将字符串写入文件

C++ 在编译时比较模板类型

c++ - 如何在模板化基类中命名嵌套模板?

c++ - 派生模板类访问基类成员数据

c++ - 关于 C++ 中命名空间的极其基本的问题

c++ - 如何在 C++ 中的命名空间内转发声明数组

c++ - 是否可以将一个字符串的两个索引添加到一个字符,然后将该字符转换为 C++ 中的 int?

c++ - 是否可以保证带有 UB 的代码是否可以访问?

c++ - cout 和 cin 在 C++ 的函数中重复?