在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");}
}
感谢。
答案 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
是首选方式,因为它不仅可以帮助读者,还可以强制进行编译时检查,以便声明中的拼写错误不会引入细微的错误。