RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1553095
Accepted
Harry
Harry
Asked:2023-11-25 14:58:03 +0000 UTC2023-11-25 14:58:03 +0000 UTC 2023-11-25 14:58:03 +0000 UTC

多重继承中的歧义

  • 772

回答了继承过程中同名的问题。我编写了以下代码(见下文)。Visual C++ 编译它并运行它。但许多其他编译器发誓

d.C::A::x = 2;
d.B::A::x = 3;

和挑战out(),认为选择存在模糊性A::x。坦白说,我不这么认为;VC++ 的输出符合预期。

有人可以通过明确引用标准的条款来证明这个或那个编译器的正确性吗?B当明确指出通过or 的路径时,歧义从何而来C?如何在这样的编译器中消除它,谁不满意?

#include <iostream>
using namespace std;
struct A
{
    int x;
    void out() { cout << x << endl; }
};
struct B: public A
{
    int x;
    void out() { cout << x << endl; }
};
struct C: public A
{
    int x;
    void out() { cout << x << endl; }
};
struct D: public B, public C
{
    int x;
    void out() { cout << x << endl; }
};

int main()
{
    D d;
    d.C::x = 0;
    d.B::x = 1;
    d.C::A::x = 2;  // неоднозначность в не-MSVC
    d.B::A::x = 3;  // неоднозначность в не-MSVC

    d.B::A::out();  // неоднозначность в не-MSVC
    d.C::A::out();  // неоднозначность в не-MSVC
    d.B::out();
    d.C::out();
}
c++
  • 1 1 个回答
  • 144 Views

1 个回答

  • Voted
  1. Best Answer
    HolyBlackCat
    2023-11-25T18:49:11Z2023-11-25T18:49:11Z

    当你写的时候B::A(不管它后面是什么- 它在任何地方都一样) - 它与简单的(if - 继承人).是一样的,所以它变成- 这显然是一个歧义和错误。ABAd.C::A::xd.A::x

    • 为什么B::A和 一样A?

      因为注入类名。Injected-class-name 类似于一个隐藏的名称using ИмяКласса = ИмяКласса;,它在每个类中自动创建,并以与所有其他类成员相同的方式继承。

      也就是说,B它继承自A类似的东西using A = A;,所以B::A它的意思是A。

      (它也应该遵循它A::A的含义A,但这并不是在任何地方都有效:它struct B : A::A {};有效,但A::A a;不再有效 - 因为[class.qual]/1(在第二种情况下,编译器认为A::A它是构造函数的名称A- 就像继承时一样)构造函数 - using A::A;)。

    • 它如何按照与其他地方相同的规则::获得工作权?毕竟, (where is a non-static member).似乎只能在!之后才起作用。A::xx.

      但不,A::x对于非静态成员它在很多地方都有效。只要不计算表达式的结果,例如在sizeofand中decltype:

      #include <type_traits>
      
      struct A {int x;};
      
      static_assert(sizeof(A::x) == sizeof(int));
      static_assert(std::is_same_v<decltype(A::x), int>);
      

      这个怎么样:

      static_assert(sizeof(A::x + 42) == sizeof(int));
      static_assert(std::is_same_v<decltype(A::x + 42), int>);
      

    ::一般来说,该标准不会在任何地方专门描述右侧的行为。.它在任何地方的工作方式都是相同的。即没有“始终进入父母的父母”的过程;您能够在 in 之后指定多个父级的唯一原因d.C::A::x是注入的类名。

    他清楚地谈到你的案件说[expr.ref]/7:

    [用类似...的表达方式E1.E2]

    如果E2是非静态成员,并且E2直接作为成员的类是以下命名类 ([class.access.base]) 的不明确基 ([class.member.lookup]),则程序格式错误E2。

    这里,“命名类”是点左边的对象类型。


    还有另一种访问父字段的方法 - 将对象转换为对父字段的引用:

    static_cast<A &>(static_cast<C &>(d)).x
    

    或者像这样:

    static_cast<C &>(d).A::x
    
    • 4

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5