问题标签 [name-hiding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
28 浏览

c++ - 为什么没有显式范围解析就无法访问父类的父方法?

让我们考虑这段代码:

exec为什么在类中看不到内联非虚方法device_uart

0 投票
2 回答
1631 浏览

c++ - C++ 嵌套范围访问

我最近在cppreference 中看到了这段代码:

哪个输出:

这很好,我了解整个嵌套范围的事情,并且我知道当堆栈在语句结束时展开它时,if 范围内的“str”将被销毁,因此在那之后它将不可用,因此第二个print 将主要的“str”作为其参数。

但是,我知道主“str”实际上在 IF 中可用,或者至少应该是可用的,但问题是如何从 IF 语句中访问主“str”?

我怎么能从 main 和/或 if 内部访问全局“str”?

我知道只使用不同的名称会更简单,但是这个问题不是针对特定的实际应用程序,而是为了更好地理解 c++ 范围。

0 投票
0 回答
50 浏览

c++ - 名称隐藏继承的非虚函数的替代方法

我有这个设计问题。两个简单的结构,用于包装在部分代码中直接访问的一些成员(基类的成员比显示的要多)。基类中有一个函数将这些成员聚合在一起。派生类定义了更多成员,函数将这些成员聚合为基类聚合的结果。聚合函数在一个大循环中调用,因此不需要虚函数,这会产生主函数中显示的问题,当调用 foo 时,同一个对象的行为不同(因为在同一个对象基础与派生版本上调用不同的函数) . 我考虑了一些替代方案,例如使用私有继承,如果成员不直接在代码中访问,这将是适当的。

0 投票
2 回答
92 浏览

java - this 指的是在子类对象上调用非覆盖方法时会发生什么?

考虑以下代码:

我有几个问题。

  1. 创建子类的对象时,实际创建了多少个对象?只有一个,通过引入子类中定义的新属性来扩展超类的属性?或者两个,我们可以访问的子类对象和一个超类对象,它们的存在对我们来说是隐藏的?

  2. 如果创建了两个对象,当在子类对象上调用非覆盖方法时,哪个对象负责?换句话说,this非覆盖方法内部指的是什么?隐藏的超类对象还是子类对象?

  3. 如果您对#2 的回答是超类的隐藏对象,那么为什么上面的代码会打印"I am Employee"System.out.println("I am " + getClass().getSimpleName());inside printClassName

  4. printClassName如果您对#2 的回答是子类的对象,那么为什么打印里面的第一行"I am Person"

0 投票
2 回答
445 浏览

java - 如何在主方法中访问超类变量和方法?

使用super我可以访问Super Class 变量和方法,例如C可以访问B的方法,但是如果我想访问AC中的方法怎么办。我如何以简单的方式做到这一点,比如使用super?就像两个超级应该做的伎俩......我如何仅通过分配 C 类(如果存在名称隐藏)来访问 A 类方法?

0 投票
1 回答
29 浏览

c++ - 静态函数继承的名称隐藏的初始使用

我有一个基类Base和一些子类BaseDerivate1...... BaseDerivateN我的部分代码是通用的,并通过 define 访问使用的类来支持任何子类BASE_DERIVATE

我现在需要添加一个静态函数,子类可以声明但不必声明。对于声明的派生类StaticFunc(),我想调用它。在所有其他情况下,我想调用回退函数Base::StaticFunc()。调用如下所示:

所以我故意在这里使用名称隐藏。StaticFunc永远不会从类中调用。我的问题是:C++ 标准是否支持这一点,或者这会导致某些编译器出现编译器错误。另外:有没有更好的方法来做“静态继承”?然而,我坚持定义BASE_DERIVATE概念。

0 投票
2 回答
649 浏览

c++ - 使用非虚基类函数与派生类非实现虚函数之间的区别

这个问题与覆盖虚函数和隐藏非虚函数有什么区别?,但我问的不是技术细节,而是非虚函数和虚函数的使用。

这里有一点背景。假设我有一个基类 A 和两个派生类 B 和 C

正如预期的那样,这将输出以下内容:

如果我在派生类中未实现虚函数 bar(),则派生类 B 和 C 中对 bar() 的任何调用都会解析为 A::bar()。xorp() 是一个非虚函数,也可以作为 b.xorp() 或 bA::xorp() 从派生类中调用。

例如,如果我要在 B 中实现 xorp(),它将有效地隐藏 A::xorp(),而对 b.xorp() 的调用实际上是对 bB::xorp() 的调用。

使用上面的示例,这让我想到了我的问题。假设我有一个派生类实现所需的辅助函数。

辅助函数是非虚拟成员函数(如 xorp())与辅助函数是派生类不覆盖的虚函数(bar()) 之间有区别吗?

通读关于类对象布局和 VTABLE 的演示文稿(https://www.cs.bgu.ac.il/~ashaf/SPL/Inheritance.pptx,幻灯片 28-35)我无法真正发现差异,因为两者都不是-virtual 和非覆盖的虚函数指向同一个地方(即基类中的函数)

谁能给我一个例子,这两种方法会产生不同的结果,或者如果有一个我没有发现的警告?

0 投票
2 回答
1251 浏览

c++ - 具有 2 个以上类的“隐藏的重载虚函数”

最小的例子:

编译器:

问题(假设来自visitor3的评论行保持评论):

  • 为什么编译器会抱怨它visitor3::visit(B&)正在隐藏visitor2::visit(C&)
  • 为什么它抱怨visitor3::visit(B&)隐藏visitor1::visit(A&)(这里有什么不同)?

附加问题:我如何实现这两者visitor2::visit(C&)visitor1::visit(A&)不是隐​​藏visitor3using visitor2::visit;够用吗visitor3

0 投票
2 回答
130 浏览

c++ - C++继承中名称隐藏的优先级

为什么从指向基类(A 类)的指针调用 print() 有效,而从子类对象(C 类)调用 print() 无效?

语句 1:将给出“print A”作为输出,因为 A::print() 是一个虚函数,它将调用 C 类的 print() 函数,该函数继承自 A::print()。这将证明 C 类确实具有 print() 函数

声明 2:这将导致编译器错误,因为 B::print(int x) 将隐藏 A::print()。

声明3:会报编译错误。为什么?

可能是因为 print() 仍然隐藏在 Class C 中,因为 Class C 也继承了 B::print(int x)。如果是这种情况,那么为什么从 a->print() 调用有效?

另一个问题:是否有任何规则指定 B::print(int x) 将 A::print() 隐藏在子类中?

0 投票
1 回答
57 浏览

c++ - 为什么动态绑定可以覆盖 C++ 中隐藏的名称?

我了解到内部名称隐藏了外部名称(因此重载不会跨越范围),因为名称查找在类型匹配之前进行。所以我写了下面的 C++ 代码来玩这个规则:

根据隐藏规则,Derived::fcn(std::string)函数应该隐藏Base::fcn(). 但是上面的代码无视规则编译并正确运行。这是否意味着动态绑定可以覆盖隐藏在 C++ 中的名称?问题是,如果我将类型更改为bpto Derived*,隐藏规则会通过发出编译错误来生效:

'Derived::fcn':函数不接受 0 个参数

你能帮我解释一下这个现象吗?具体来说,动态绑定可以覆盖我假设的名称隐藏吗?如果是这样,如果指针指向派生类,为什么覆盖会失败?谢谢你。