是否需要指定覆盖功能虚拟?

时间:2016-10-25 21:17:06

标签: c++

在Cplusplus中,在派生类中,如果我们定义一个成员函数来覆盖其父类中的成员函数,我们是否需要将派生类中的成员函数声明为虚拟?

例如,我们是否需要在g中声明B是虚拟的,以便覆盖A::g?以下哪一项对于上述目的是正确的?

class A{
public:
void f(){printf("A");}
virtual void g(){printf("A");}
}
class B : public A{
public:
void f(){printf("B");}
void g(){printf("B");}
}

class A{
public:
void f(){printf("A");}
virtual void g(){printf("A");}
}
class B : public A{
public:
void f(){printf("B");}
virtual void g(){printf("B");}
}

感谢。

5 个答案:

答案 0 :(得分:9)

一个方法在一个类中是虚拟的,即使你没有向它们添加virtual,它的子类也有这些虚拟类。

添加override是避免细微错误的好习惯:

class A{
public:
    void f()         { printf("A"); }
    virtual void g() { printf("A"); }
};
class B : public A{
public:
   void f()          { printf("B"); }
   void g() override { printf("B"); }
};

答案 1 :(得分:6)

不,不。该函数从层次结构中的第一个点开始是虚拟的,您可以在其中声明它。

您可以而且应该在c ++ 11及更高版本中将其指定为override。它明确指定您正在尝试覆盖基类中的虚函数。如果拼错函数名称,错误输入参数或执行其他任何可以被视为添加函数重载的内容,则会发出错误。在c ++ 11之前,以前的错误会默默编译。

答案 2 :(得分:3)

在派生类中定义成员函数virtual是可选的。您可以使用C ++ 11的override来显式覆盖。

答案 3 :(得分:2)

他们都做同样的事情。您不需要在派生类中明确说出virtual,只要它在基类中是虚拟的。

答案 4 :(得分:2)

  

在Cplusplus中,在派生类中,如果我们定义一个成员函数来覆盖其父类中的成员函数,我们是否需要将派生类中的成员函数声明为虚拟?

从工作草案[class.virtual]/2(强调我的):

  

如果在类vf和类Base中声明虚拟成员函数Derived,直接或间接地从Base派生,则成员函数{{1声明同名,参数类型列表,cv-qualification和ref-qualifier(或缺少相同),vf也是虚拟的(是否或者不是如此声明)并且它会覆盖Base::vf

所以,不。这不是必需的。

在C ++之前的11时代,声明Derived::vf派生类中的成员函数也有助于读者理解幕后发生的事情。
从C ++ 11开始,Base::vf是首选方式,因为它不仅可以帮助读者,还可以强制进行编译时检查,以便声明中的拼写错误不会引入细微的错误。