问题标签 [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# - C# 继承、新修饰符和泛型
我很难找到正确的方法来解决这个问题:
我的数据结构:
我的业务对象包含这些数据结构的集合
我正在尝试使用的通用方法:
我的问题是在 linq 方法中调用“linqfluent.FlowCollection”需要基类 Fluent 的 FlowCollection,它是空的。
我怎样才能强制使用孩子的财产呢?谢谢!
c++ - 从继承的类中实现抽象方法
我正在尝试做一些我以前没有真正做过的事情。我基本上有3节课。A类是具有纯虚拟方法的抽象类,B类是它自己的类,其中包含与A类中的虚拟方法同名的方法。我试图将C类中的所有内容联系在一起。我想在 C 中继承 B 类和 A 类(多重继承),并使用 B 类中的方法来实现 A 类中的方法。这样我创建了一个模块化方法。下面的示例是我的代码的一个非常简化的版本。
我可以编译 C 类,但是当我尝试构造一个 C 类时,new C()
我收到一条编译器消息,提示“由于以下成员,无法实例化抽象类:int methodA()' : is abstract”。
有没有办法通过 C 类中的多重继承使用 B 类来实现 A 类?
编辑:希望保持 B 类具体。
c++ - 关于名称隐藏、覆盖和虚拟表的编译错误
我在玩c++规则。我遇到了一个错误,但我无法解释。请帮助解释为什么会发生编译错误。顺便说一句,我对解决这个问题并不感兴趣。谢谢
Q1 为什么名称隐藏在这种情况下不起作用?例如,如果我们删除 lineA 的关键字 virtual。编译将起作用
Q2在case2中添加一个函数后,编译通过。
请帮助解释 Q1 和 Q2。
#包括
输出:
案例2:
c++ - 警告:重载的虚函数“Base::process”在“派生”类中仅被部分覆盖
我低于警告。我的部分代码是:
我收到以下警告:
我以任何方式将进程作为虚拟功能,所以我期待这个警告不应该出现......这背后的原因是什么?
c++ - 访问与局部变量(或参数)同名的成员字段
考虑以下代码片段:
选项 1 是否等同于选项 2?是否存在一种形式优于另一种形式的情况?哪个标准条款描述了这些选项?
c++ - 不命名类型错误是由于现有枚举,但为什么呢?
我刚刚收到这个错误:“错误:'Symbol'没有命名类型”
我发现了一些关于循环依赖的其他 StackOverflow 问题,但这里不是这种情况。事实上,我可以通过将它放在源文件的顶部来重现它:
这给出了第三行的“错误:'符号'没有命名类型”。如果我取消注释第二行,我仍然会得到同样的错误,但就在它之前我现在得到:“错误:'class Symbol'的重新定义”!
经过更多的探索之后,似乎第 3 方库定义了一个enum
where 。Symbol
那个库和我自己的代码都没有使用命名空间,因此将我的代码移动到命名空间内已经在我的待办事项列表中,我接下来会这样做,希望问题会消失。
但是让我困惑的是为什么我没有得到class Symbol{}
在线错误?如果它与枚举冲突,以至于我永远无法实例化该类,为什么它不抱怨?我觉得我要么缺少标志g++
,要么我的 C++ 知识存在差距。我正在为有人告诉我这是一个功能而不是错误而做好准备。
(顺便说一句,我正在使用g++ -c -std=gnu++0x -Wall -g -Werror ...
和 g++ 4.8.1)
c++ - C++ 为特定模板特化添加重载方法
我有一个非常有趣的问题:我有两个模板类。一个可以采用任何模板参数,另一个更专业(对于这个玩具问题,我们会说它必须采用浮点数)。
现在我有另一个模板类 Foo。Foo 对它的模板参数没有限制,函数 foo 接受 aCanBeAnything
或 aMustBeFloat
的相同类型。我希望在这里使用显式模板实例化,所以我只希望MustBeFloat
当我的模板参数是浮点时存在重载。
最简单的解决方案似乎是专门化 Foo,但我不喜欢跨两个类复制接口的想法。我想出了一个几乎可以工作的 CRTP 解决方案,有一个问题我会在一分钟内提到
所以这就是问题所在:foo( MustBeFloat<value_type> & )
按原样,通过名称隐藏在子类中隐藏了对的调用,并且编译器给了我“没有对方法 foo 的匹配调用”错误。如果我添加该行using Parent::foo;
以将其关闭,则在实例化 non-floating point 时出现“父类中不存在 foo”错误Foo
,因为该方法不存在那么远。
有任何想法吗?如果有更优雅/更有效的解决方案,我可以抓取整个解决方案。
编辑:澄清一下:我在这里进行显式实例化,这就是为什么我需要该方法仅在我有浮点模板参数时才存在。
这会实例化每个类成员,因此依赖于不实例化某些方法的方法是行不通的。
EDIT2:好的,所以我想太多了。这是我要使用的解决方案:
这一切都有效。耶!感谢那些帮助我找到这个解决方案并提出其他更具创造性的解决方案的人。
c++ - 隐藏在 C++ 中的名称
第一个给出错误为
但是如果我们将方法更改为接受 char 而不是 int* 那么
输出:
伴随着窗户的声音(叮)。- ANS:这里是隐式转换。请检查下面的编辑。
所以名称隐藏在第一个示例中有效,但在第二个示例中不起作用。谁能解释为什么?我还尝试过使用不同数量的参数(如 int func(int a) 、 int func (int a, int b))制作重载的重写虚函数,然后只重写其中一个。在这种情况下,名称隐藏也不起作用,派生类能够派生未覆盖的基类的虚函数。
为什么这个名字隐藏只在这种特殊情况下有效?
编辑1:
With Context to Eternals 隐式转换的解释。我有另一个应该隐藏名称但没有的程序。在这个版本中,方法是根据不同的参数来区分的。
输出:
在这种情况下,名称隐藏也不起作用。
c++ - 通过“使用”关键字撤消名称隐藏。在孙子班不工作
例如,在下面的程序中,我通过“使用”关键字撤消名称隐藏。如果我有基类和一个派生类“我得到预期的模棱两可的调用错误”。但是,如果我现在有两个派生类(孩子和孙子),孩子和孙子在这里具有相同的重载函数,我也会通过“使用”关键字撤消名称隐藏。但它正在被编译并得到输出。我的问题是为什么我没有收到“对重载函数的模糊调用”的错误。
c++ - 模板参数名称隐藏
我最近被(简化)咬了
换句话说,类成员名称隐藏了模板参数(即使来自基类,因此在本地上下文中并不完全明显)。
做一些实验我发现:
这个明显荒谬的规则背后的理由(如果有的话)是什么?
我能想到的唯一方法是给出丑陋的模板参数名称,这也意味着不使用保留名称就不可能安全地编写模板(因为模板中使用的类可能会与参数名称冲突......请注意,很多 C++代码对私有成员使用丑陋的名称)。
PS:我没有深入研究这个问题的标准,但 g++ 和 clang++ 都同意这种行为,所以我不认为这是一个错误。
PPS:在实际代码中,被隐藏的模板参数名为tid
,并且是整数而不是类型。-Wall
不足以通知隐藏,我在用 valgrind 调试几个小时后发现了它。