问题标签 [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.
c++ - 为什么没有显式范围解析就无法访问父类的父方法?
让我们考虑这段代码:
exec
为什么在类中看不到内联非虚方法device_uart
?
c++ - C++ 嵌套范围访问
我最近在cppreference 中看到了这段代码:
哪个输出:
这很好,我了解整个嵌套范围的事情,并且我知道当堆栈在语句结束时展开它时,if 范围内的“str”将被销毁,因此在那之后它将不可用,因此第二个print 将主要的“str”作为其参数。
但是,我知道主“str”实际上在 IF 中可用,或者至少应该是可用的,但问题是如何从 IF 语句中访问主“str”?
我怎么能从 main 和/或 if 内部访问全局“str”?
我知道只使用不同的名称会更简单,但是这个问题不是针对特定的实际应用程序,而是为了更好地理解 c++ 范围。
c++ - 名称隐藏继承的非虚函数的替代方法
我有这个设计问题。两个简单的结构,用于包装在部分代码中直接访问的一些成员(基类的成员比显示的要多)。基类中有一个函数将这些成员聚合在一起。派生类定义了更多成员,函数将这些成员聚合为基类聚合的结果。聚合函数在一个大循环中调用,因此不需要虚函数,这会产生主函数中显示的问题,当调用 foo 时,同一个对象的行为不同(因为在同一个对象基础与派生版本上调用不同的函数) . 我考虑了一些替代方案,例如使用私有继承,如果成员不直接在代码中访问,这将是适当的。
java - this 指的是在子类对象上调用非覆盖方法时会发生什么?
考虑以下代码:
我有几个问题。
创建子类的对象时,实际创建了多少个对象?只有一个,通过引入子类中定义的新属性来扩展超类的属性?或者两个,我们可以访问的子类对象和一个超类对象,它们的存在对我们来说是隐藏的?
如果创建了两个对象,当在子类对象上调用非覆盖方法时,哪个对象负责?换句话说,
this
非覆盖方法内部指的是什么?隐藏的超类对象还是子类对象?如果您对#2 的回答是超类的隐藏对象,那么为什么上面的代码会打印
"I am Employee"
为System.out.println("I am " + getClass().getSimpleName());
insideprintClassName
。printClassName
如果您对#2 的回答是子类的对象,那么为什么打印里面的第一行"I am Person"
?
java - 如何在主方法中访问超类变量和方法?
使用super我可以访问Super Class 变量和方法,例如C可以访问B的方法,但是如果我想访问A在C中的方法怎么办。我如何以简单的方式做到这一点,比如使用super?就像两个超级应该做的伎俩......我如何仅通过分配 C 类(如果存在名称隐藏)来访问 A 类方法?
c++ - 静态函数继承的名称隐藏的初始使用
我有一个基类Base
和一些子类BaseDerivate1
...... BaseDerivateN
我的部分代码是通用的,并通过 define 访问使用的类来支持任何子类BASE_DERIVATE
。
我现在需要添加一个静态函数,子类可以声明但不必声明。对于声明的派生类StaticFunc()
,我想调用它。在所有其他情况下,我想调用回退函数Base::StaticFunc()
。调用如下所示:
所以我故意在这里使用名称隐藏。StaticFunc
永远不会从类中调用。我的问题是:C++ 标准是否支持这一点,或者这会导致某些编译器出现编译器错误。另外:有没有更好的方法来做“静态继承”?然而,我坚持定义BASE_DERIVATE
概念。
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 和非覆盖的虚函数指向同一个地方(即基类中的函数)
谁能给我一个例子,这两种方法会产生不同的结果,或者如果有一个我没有发现的警告?
c++ - 具有 2 个以上类的“隐藏的重载虚函数”
最小的例子:
编译器:
问题(假设来自visitor3的评论行保持评论):
- 为什么编译器会抱怨它
visitor3::visit(B&)
正在隐藏visitor2::visit(C&)
? - 为什么它不抱怨
visitor3::visit(B&)
隐藏visitor1::visit(A&)
(这里有什么不同)?
附加问题:我如何实现这两者visitor2::visit(C&)
而visitor1::visit(A&)
不是隐藏visitor3
?using visitor2::visit;
够用吗visitor3
?
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() 隐藏在子类中?
c++ - 为什么动态绑定可以覆盖 C++ 中隐藏的名称?
我了解到内部名称隐藏了外部名称(因此重载不会跨越范围),因为名称查找在类型匹配之前进行。所以我写了下面的 C++ 代码来玩这个规则:
根据隐藏规则,Derived::fcn(std::string)
函数应该隐藏Base::fcn()
. 但是上面的代码无视规则编译并正确运行。这是否意味着动态绑定可以覆盖隐藏在 C++ 中的名称?问题是,如果我将类型更改为bp
to Derived*
,隐藏规则会通过发出编译错误来生效:
'Derived::fcn':函数不接受 0 个参数
你能帮我解释一下这个现象吗?具体来说,动态绑定可以覆盖我假设的名称隐藏吗?如果是这样,如果指针指向派生类,为什么覆盖会失败?谢谢你。