问题标签 [non-virtual-interface]

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 投票
4 回答
1724 浏览

c++ - CTRP 派生类中没有名为“type”的类型

我一直在尝试使用Curiously Recurring Template Pattern用于通用单参数仿函数,并有两种实现:一种使用有效的模板模板参数,另一种我尝试在接口类中访问派生的 Functor::type。在后一个示例中,编译器 (gcc 5.4.0) 报告

错误: “struct Cube< double >”中没有名为“ type ”的类型

然后我尝试在以下两个类的 main() 中使用 T=double 进行编译:

是否可以修改 FunctorInterface_2/Cube 示例以使其工作,或者是否需要像第一个示例中那样在 T 上对接口类进行模板化?谢谢!

编辑:使用 gcc -std=c++14,我可以通过在 FunctorInterface_1::operator() 中使用自动返回和参数类型来编译和运行第二个示例,但是,据我所知,自动参数类型不是C++14 标准。

编辑2:嗯,我觉得有点厚。我刚刚意识到我可以在一个新参数上模板 FunctorInterface_1::operator(),但是,对于我想到的应用程序,我真的希望我的基类能够访问派生类中定义的类型。

0 投票
0 回答
72 浏览

c++ - NVI 不会阻止名称隐藏;为什么不使用虚拟决赛呢?

考虑以下:

正如您在上面看到的,Foo 类试图通过 Foo::method() 成员函数遵循 NVI 模式。

是什么阻止了子类(在本例中为 Bar)使用 Bar::method() 隐藏 Foo::method()?我试过了,我猜什么都没有。如果您取消注释 Bar::method(),控制台应用程序确实会执行 method() 的 Bar 实现,这完全有意义。

这就引出了一个问题,为什么不使用 virtual final 来禁止在子类中隐藏该方法的名称?Foo 类中提供的示例。

谢谢

0 投票
4 回答
598 浏览

c# - C#调用接口方法非虚实现

我是 C# 新手,我不明白为什么编译器不会抱怨这段代码。这是类的层次结构:

执行代码:

执行---->> A - Able时打印。为什么?编译器如何知道应该调用什么函数?

当决定调用什么函数时——运行时还是编译时?如果我玷污了一个新班级class CAble : IAble怎么办?

0 投票
2 回答
116 浏览

c++ - 非虚拟接口习语是否不适用于纯虚函数?

我曾经写过这样的接口类:

这意味着我可以轻松地继承几个接口并像这样使用它

但我最近读到了关于非虚拟界面的成语(像这样的东西http://www.gotw.ca/publications/mill18.htm),按照这些指导方针,我应该像这样编写我的界面:

这意味着其余代码现在看起来像这样

...除了现在它没有编译,因为对的调用run()变得模棱两可(error: request for member ‘run’ is ambiguous)。过去接口中无害的重叠现在会导致名称冲突。

重读非虚拟接口习语的论点,我觉得问题在于我将它应用于纯虚函数的虚函数。是这样吗?我应该只将 NVI 成语用于非纯虚函数吗?

编辑1:有人说该run()函数可能在它自己的接口类中。这实际上很有意义:要么两者run()具有相同的含义并且应该考虑接口,要么它们具有不同的含义并且我们希望编译器说事情是模棱两可的。当使用纯虚函数不存在的 NVI 时,这仍然给我们留下了菱形继承问题

编辑2:事实证明,如果我在其自己的接口类中将其分解为纯虚函数,并run()从中继承,事情实际上并没有我想象的那么好。如果我引入(从两个接口类继承)并从中继承,我可以调用但我不能从 a 多态地使用它(同样,调用被认为是模棱两可的)。SomeInterfaceOtherInterfaceCombinedInterfaceConcreteClassrun()myObjectCombinedInterface*

结论:我的结论是 1) 接口不应该重叠,或者被分解。2)接口类之间的继承应该总是虚拟的