该功能是否覆盖基本功能?

格拉兹纳拉克

我使用三种不同的编译器来编译此代码。其中之一(我最不信任的一个)警告说,“派生”中的功能会隐藏Base中的功能。其他编译器(其中一个是Visual C ++)不会发出警告。如果启用/ Wall或/ W4,Visual C ++甚至都不会发出警告。

我倾向于认为这是编译器中的一个错误,因为它会编译代码,所以会发出警告。如果它确实没有覆盖基函数,那么当我创建派生模板的实例时,它应该给出一个错误。

谁能确认这应该如何表现?

struct Base
{
   virtual void Func(float f) = 0;
};

template <typename T>
struct Derived : Base
{
   virtual void Func(T f){}
};

int main()
{
   Derived<float> d;
   d.Func(0);
   return 0;
}

Derived与实例化float,我得到了意想不到的警告。Derived与实例int我得到一个错误,符合市场预期。

虚拟软件公司

它确实被覆盖了。您可以使用override关键字在C ++ 11中轻松说服自己,如果不重写该函数,则该代码将不允许编译代码:

struct Base
{
   virtual void Func(float f) = 0;
   virtual ~Base() = default; // to silence warnings
};

template <typename T>
struct Derived : Base
{
   void Func(T f) override {} // will fail to compile if not overriding
};

int main()
{
   Derived<float> d;
   d.Func(0);
   return 0;
}

这里的例子

请注意,在C ++ 11之前的版本中,您可以virtual通过在派生类中更改其签名来意外隐藏基本函数,因此,即使您标记了派生函数,virtual该代码仍然可以编译,但不再是多态的,请参见此处的示例不幸的是,即使使用,g ++也不会提供任何警告-Wall -Wextra这就是为什么override在编译时实际执行true覆盖的更安全的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Haskell基本功能

来自分类Dev

cljc文件的基本功能

来自分类Dev

获取python基本功能列表

来自分类Dev

在Haskell中创建基本功能

来自分类Dev

基本功能帮助-Python

来自分类Dev

对象返回中的基本功能

来自分类Dev

JavaScript使用变量的基本功能

来自分类Dev

基本功能的奇怪行为

来自分类Dev

AngularJS中的基本功能

来自分类Dev

对象返回中的基本功能

来自分类Dev

C ++需要基本功能的指导

来自分类Dev

JavaScript:后退/前进的基本功能

来自分类Dev

Unity基本功能说明

来自分类Dev

基本功能N cov / contravariance

来自分类Dev

MATLAB中的基本功能

来自分类Dev

球拍基本功能列表

来自分类Dev

mangoose 加入 mangodb 的基本功能?

来自分类Dev

覆盖.net Web API中的动作映射和参数的基本功能

来自分类Dev

与基本功能同名的球拍宏功能

来自分类Dev

WordPress功能可为管理面板创建基本功能

来自分类Dev

Gradle项目同步失败的基本功能

来自分类Dev

R的基本功能中的表观异常

来自分类Dev

如果我包含jQuery,则找不到基本功能

来自分类Dev

哪些R版本包含哪些基本功能

来自分类Dev

如何使用“ CImg”及其基本功能

来自分类Dev

使用Matlab中的基本功能重建图像

来自分类Dev

包含基本功能的特定类型的集合类

来自分类Dev

排队基本功能(放入)调用(程序崩溃)

来自分类Dev

二进制搜索的基本功能