【问题标题】:Access member of non-virtual base class inherited from two different classes从两个不同的类继承的非虚拟基类的访问成员
【发布时间】:2019-09-10 13:42:13
【问题描述】:

在多个派生类中,其基类继承自同一个基类,并且两个基类都定义了与其基类中的一个同名的成员,如何通过不同的路径访问该成员?

标题很长,这里有一个插图。

struct A{int i;};
struct B1:A{int i;};//non virtual
struct B2:A{int i;};//non vitual
struct C:B1,B2{};

现在如何访问A 中的iB1 中的iB1 中的B1 对象中的i

为了更清楚,c.i 当然是模棱两可的,其中cC。但是c.A::i也是模棱两可的,有两种可行的路径:

C -> B1 -> A
C -> B2 -> A

我如何指定使用一个?

【问题讨论】:

  • c.B2::A::i 似乎适用于 MSVC,但不适用于 GCC 或 Clang。
  • c.B1::ic.B2::i 还是我错过了什么?
  • @SergeyA 在B1B2中有名为i的成员。
  • @user 是的。但是您仍然可以独立访问它们。为什么我的建议对你不起作用?
  • @SergeyA 您正在访问B1B2 中的成员i,而我想访问A 中的i

标签: c++ inheritance scope multiple-inheritance


【解决方案1】:

static_cast 是一种冗长但明确的方法:

C c;
static_cast<B1&>(c).i;
static_cast<B2&>(c).i;
static_cast<A&>(static_cast<B1&>(c)).i;
static_cast<A&>(static_cast<B2&>(c)).i;

【讨论】:

  • 或者,static_cast&lt;B1&amp;&gt;(c).A::i
  • @user static_cast 通常没有运行时成本。您可以通过编译器尝试验证。
  • @user 在这个特定的上下文中,没有额外的生成代码。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2016-05-20
  • 2023-04-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多