请考虑以下代码:
struct virtualfoo
{
virtualfoo{};
virtual ~virtualfoo{};
virtual double doStuff() = 0
};
struct realbar : virtualfoo
{
realbar{};
virtual ~realbar{};
virtual double doStuff();
};
由于我想为doStuff()
实施realbar
,因此虚拟不是强制性的。但如果我做对了,那么realbar::doStuff()
旁边的虚拟说明符就不会有害,是吗?
使用/不使用虚拟可以获得哪些副作用?
答案 0 :(得分:8)
派生类中不需要虚拟关键字。然而,它使代码更清晰。同样在 C ++中引入了 override
关键字,它允许源代码清楚地指定成员函数意图来覆盖基类方法。< / p>
使用关键字override
,编译器将检查基类,以查看是否存在具有此确切签名的虚函数。如果没有,编译器将抛出错误。
答案 1 :(得分:0)
您是否明确将realbar::doStuff
声明为虚拟并不重要,因为virtual
因虚拟而隐式virtualfoo:doStuff
。所以没有副作用;无论如何,realbar::doStuff
将是虚拟的。例如,提供此online C++ draft standard:
10.3虚拟功能
(2)如果在类Base和in中声明了虚拟成员函数vf 一个类派生,直接或间接来自Base,一个成员 函数vf,同名,参数类型列表(8.3.5), 与Base :: vf一样的cv-qualification和ref-qualifier(或不存在) 声明,然后Derived :: vf也是虚拟的(无论是否是这样 声明)并覆盖Base :: vf。 ...