问题标签 [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.
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(),但是,对于我想到的应用程序,我真的希望我的基类能够访问派生类中定义的类型。
c++ - NVI 不会阻止名称隐藏;为什么不使用虚拟决赛呢?
考虑以下:
正如您在上面看到的,Foo 类试图通过 Foo::method() 成员函数遵循 NVI 模式。
是什么阻止了子类(在本例中为 Bar)使用 Bar::method() 隐藏 Foo::method()?我试过了,我猜什么都没有。如果您取消注释 Bar::method(),控制台应用程序确实会执行 method() 的 Bar 实现,这完全有意义。
这就引出了一个问题,为什么不使用 virtual final 来禁止在子类中隐藏该方法的名称?Foo 类中提供的示例。
谢谢
c# - C#调用接口方法非虚实现
我是 C# 新手,我不明白为什么编译器不会抱怨这段代码。这是类的层次结构:
执行代码:
执行---->> A - Able
时打印。为什么?编译器如何知道应该调用什么函数?
当决定调用什么函数时——运行时还是编译时?如果我玷污了一个新班级class CAble : IAble
怎么办?
c++ - 非虚拟接口习语是否不适用于纯虚函数?
我曾经写过这样的接口类:
这意味着我可以轻松地继承几个接口并像这样使用它
但我最近读到了关于非虚拟界面的成语(像这样的东西http://www.gotw.ca/publications/mill18.htm),按照这些指导方针,我应该像这样编写我的界面:
这意味着其余代码现在看起来像这样
...除了现在它没有编译,因为对的调用run()
变得模棱两可(error: request for member ‘run’ is ambiguous
)。过去接口中无害的重叠现在会导致名称冲突。
重读非虚拟接口习语的论点,我觉得问题在于我将它应用于纯虚函数的虚函数。是这样吗?我应该只将 NVI 成语用于非纯虚函数吗?
编辑1:有人说该run()
函数可能在它自己的接口类中。这实际上很有意义:要么两者run()
具有相同的含义并且应该考虑接口,要么它们具有不同的含义并且我们希望编译器说事情是模棱两可的。当使用纯虚函数不存在的 NVI 时,这仍然给我们留下了菱形继承问题
编辑2:事实证明,如果我在其自己的接口类中将其分解为纯虚函数,并run()
从中继承,事情实际上并没有我想象的那么好。如果我引入(从两个接口类继承)并从中继承,我可以调用但我不能从 a 多态地使用它(同样,调用被认为是模棱两可的)。SomeInterface
OtherInterface
CombinedInterface
ConcreteClass
run()
myObject
CombinedInterface*
结论:我的结论是 1) 接口不应该重叠,或者被分解。2)接口类之间的继承应该总是虚拟的