在派生类中添加虚拟说明符

时间:2017-06-13 13:43:45

标签: c++ class inheritance virtual

请考虑以下代码:

struct virtualfoo 
{
    virtualfoo{};
    virtual ~virtualfoo{};

    virtual double doStuff() = 0
};


struct realbar :  virtualfoo   
{
     realbar{};
     virtual ~realbar{};

     virtual double doStuff();
};

由于我想为doStuff()实施realbar,因此虚拟不是强制性的。但如果我做对了,那么realbar::doStuff()旁边的虚拟说明符就不会有害,是吗? 使用/不使用虚拟可以获得哪些副作用?

2 个答案:

答案 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。 ...