问题标签 [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 投票
2 回答
914 浏览

haskell - Haskell 模块:隐藏名称和 ghci

我试图从 Haskell 模块中仅导出名称的子集,但 ghci 很高兴地让我甚至可以访问隐藏的名称。

但是当在 ghci 中尝试这个时,我得到:

我究竟做错了什么?

(编辑:为了它的价值,我在 Arch Linux 上使用 ghci 6.12.3)

0 投票
2 回答
4614 浏览

c++ - 重载超类的函数

C++ 标准中有什么东西阻止我重载超类的函数吗?

从这对类开始:

我可以B::foo()轻松调用:

但是,如果我尝试打电话A::foo()...

...我得到一个编译器错误:

只是为了确保我没有遗漏任何东西,我更改了B's 函数的名称,以便没有重载:

现在我可以A::foo()使用第二个示例进行调用。

这是标准吗?我正在使用 g++。

0 投票
1 回答
344 浏览

c++ - 函数模板不能隐藏类名?

这适用于 GCC 和 Comeau:

这打破了科莫:

这打破了两者:

该规则由 §3.3.7/2 定义。差异仅仅是因为函数模板不是函数吗?我无法理解 GCC 的行为。

类名 (9.1) 或枚举名 (7.2) 可以被同一范围内声明的变量、数据成员、函数或枚举数的名称隐藏。如果一个类或枚举名称和一个变量、数据成员、函数或枚举器在同一范围内(以任何顺序)以相同名称声明,则无论变量、数据成员、函数或枚举器名称可见。

0 投票
4 回答
2899 浏览

c++ - 关于名称隐藏和虚函数的混淆

参考另一个so问题

考虑代码:

对于案例 2)

调用obj->gogo(7)在运行时解决。

既然obj->gogo(7)是合法的。这似乎暗示 vtable of包含应该隐藏的Derivedptr 。virtual void gogo(int a)

我的困惑是,由于名称隐藏导致案例 1) 是非法的,那么如何在运行时解决 2) 中的调用

a) Derived 的 vtable 是否包含指向 gogo(int) 的指针。

b) 如果 a) 不为真,对虚函数的调用解析是否继续到基类的 vtable。

0 投票
2 回答
140 浏览

c++ - c++ 如何从派生类中调用派生类中重载的模板类函数?

有没有办法在派生类中重载基模板类函数,并且仍然能够调用基类函数,如下所述?

0 投票
3 回答
2874 浏览

c++ - 为什么类成员函数具有相同名称的影子自由函数?

最近我注意到成员函数在类中完全隐藏了具有相同名称的自由函数。我的意思是完全不考虑重载决议的每个具有相同名称的自由函数。我可以理解为什么它是这样完成的:

在函数具有相同签名的情况下,它唯一自然的变量作用域工作方式相同。但是为什么要禁止自由函数具有不同签名的明确调用,如下所示:

我不是在问如何从类内部调用阴影自由函数。我想知道的是这个设计背后的基本原理。

0 投票
3 回答
1615 浏览

c++ - 对虚函数和派生类的混淆

我试图理解以下代码:

这打印

我不确定为什么。

第一次调用 d->f(3.14F) 调用 Derived 中的函数 f。我不是 100% 确定为什么。我看了一下这个(http://en.cppreference.com/w/cpp/language/implicit_cast),上面写着:

浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分被截断,即小数部分被丢弃。如果该值不适合目标类型,则行为未定义

对我来说,你不能这样做,因为浮点数不适合 int。为什么允许这种隐式转换?

其次,即使我只是接受上述内容没问题,对 b->f(3.14F) 的第二次调用也没有意义。b->f(3.14F)是调用虚函数f,所以这被动态解析为调用b所指向的对象的动态类型关联的f(),这是一个Derived对象。由于我们被允许将 3.14F 转换为 int,因为第一个函数调用表明这是合法的,所以 this(据我的理解)应该再次调用 Derived::f(int) 函数。然而,它调用了 Base 类中的函数。那么这是为什么呢?

编辑:这就是我想出来并向自己解释的方式。

b 是指向 Base 对象的指针,因此我们只能使用 b 访问 Base 对象的成员,即使 b 确实指向某个 Derived 对象(这是标准的 OO/继承内容)。

此规则的唯一例外是当 Base 的成员函数被声明为虚拟时。在这种情况下,派生对象可能会覆盖此函数,通过使用完全相同的签名提供另一种实现。如果发生这种情况,即使我们碰巧通过指向 Base 对象的指针访问成员函数,也会在运行时调用这个 Derived 实现。

现在,在上面的代码片段中,我们没有发生任何覆盖,因为 B::f 和 D::f 的签名不同(一个是浮点数,另一个是整数)。所以当我们调用 b->f(3.14F) 时,唯一考虑的函数就是原来的 B::f,也就是被调用的函数。

0 投票
3 回答
338 浏览

java - Java i/o 在隐藏特定单词的同时读取文本

每次出现 SECRET 时,您如何阅读以下文本?这是文本:

这条线有一个秘密词。

这条线没有一个。

这条线有两个秘密词。

这条线没有。

0 投票
4 回答
375 浏览

c++ - 名称隐藏在构造函数初始化列表中

我想修改构造函数以使用初始化列表,如下例所示:

不幸的是,我不能做第 2 版,因为您不能将this指针用于数据成员,因为(我猜)它们当时还不存在。那么,我该如何处理名称隐藏问题(即我的参数和我的数据成员具有相同的名称)?

0 投票
1 回答
404 浏览

c++ - 名称隐藏和访问基类的非虚函数(语法)

在以下代码中:

这个名字不是隐藏了吗?标准中定义的这种语法在哪里(C++11 或 C++03,没关系,这两个标准似乎都是一样的)?

我根本不知道这是可能的,这是我第一次看到这样的语法(第一次在这里看到:为什么我不能在下面的代码中访问A类函数?