使用声明(派生类)

发布于 2024-09-15 04:07:08 字数 484 浏览 9 评论 0原文

struct B1{
  int d;
  void fb(){};
};

struct B2 : B1{
  using B1::d;
  using B1::fb;

  int d;               // why this gives error?
  void fb(){}          // and this does not?
};

int main(){}

是因为, B1::fb() 被视为 B1::fb(B1*) 和 B2::fb() 对待作为B2::fb(B2*)?也就是说,隐式参数是否有助于区分这些?

$13.3.1/4-

对于非转换函数的引入 通过使用声明到派生 类,该函数被认为是 是派生类的成员 定义类型的目的 隐式对象参数。

struct B1{
  int d;
  void fb(){};
};

struct B2 : B1{
  using B1::d;
  using B1::fb;

  int d;               // why this gives error?
  void fb(){}          // and this does not?
};

int main(){}

Is it because, B1::fb() is treated as B1::fb(B1*) and B2::fb() treated as B2::fb(B2*)? That is, does the implicit parameter, help in distinguishing these?

$13.3.1/4-

For nonconversion functions introduced
by a using-declaration into a derived
class, the function is considered to
be a member of the derived class for
the purpose of defining the type of
the implicit object parameter.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

海风掠过北极光 2024-09-22 04:07:08

C++ 标准 (C++03 §7.3.3/12) 解释道:

当 using-declaration 将基类中的名称带入派生类作用域时,派生类中的成员函数会覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数类(而不是冲突)。

在您的示例中,B2::fb() 隐藏了 using 声明引入的 B1::fb()

至于为什么在 B2 的定义中同时使用 using B1::d;int d; 是格式错误的,C++标准 (C++03 §7.3.3/10) 解释:

由于using-declaration是一个声明,因此对同一声明区域中同名声明的限制也适用于using-declarations。

因此,它是格式错误的出于同样的原因,以下内容格式不正确:它会在单个声明区域中产生两个具有相同名称的对象:

struct S { int d; int d; };

The C++ standard (C++03 §7.3.3/12) explains:

When a using-declaration brings names from a base class into a derived class scope, member functions in the derived class override and/or hide member functions with the same name and parameter types in a base class (rather than conflicting).

In your example, B2::fb() hides the B1::fb() introduced by the using declaration.

As for why it is ill-formed to have both using B1::d; and int d; in the definition of B2, the C++ standard (C++03 §7.3.3/10) explains:

Since a using-declaration is a declaration, the restrictions on declarations of the same name in the same declarative region also apply to using-declarations.

So, it is ill-formed for the same reason that the following is ill-formed: it results in two objects with the same name in a single declarative region:

struct S { int d; int d; };
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文