2011-08-17 77 views
4

虚拟限定符到派生类中的基类虚拟函数是否有区别?派生类中的虚拟限定符

class b 
{ 
    public: 
    virtual void foo(){} 
}; 

class d : public b 
{ 
    public: 
    void foo(){ .... } 
}; 

class d : public b 
{ 
    public: 
    virtual void foo(){ .... } 
}; 

有没有在这两个声明的任何区别,除了它使d的孩子做意识到FOO的虚拟性()?

+0

afaik,如果其他东西从d类派生出来,它会有所作为 –

+0

@Kshitij:不,即使那样也没有什么区别。一旦“foo”是虚拟的,它永远是虚拟的,无论你离开类层次结构的底层多远。 – Nawaz

回答

2

没有区别 - 这是一种虚拟覆盖的方式。

这是一个风格问题,并已明确讨论here

1

这是更好的风格,包括虚拟关键字。但这不是必需的。

5

它没有区别。 foo在从b(及其后代)派生的所有类中都是虚拟的。

从C++ 03标准,§10.3.2:

如果虚拟成员函数VF在类Base和在派生的类声明,直接或间接地从基地成员函数衍生vf具有与Base :: vf相同的名称和相同的参数列表,因此Derived :: vf也是虚拟的(,不管它是否被声明为)并且它重写Base :: vf。

1

没有区别。

一旦foo虚拟,其虚拟永远在类层次结构,无论你从类层次结构基本走多远。

但我更喜欢写virtual即使在overrridden功能,因为它增加了可读性的代码,这是相当重要的。

+0

为了更加安全,C++ 11添加了一些可以指定的覆盖关键字,因此编译器会检查您在覆盖虚函数时是否在签名中犯了错误,并且意外超载了它 – PlasmaHH

相关问题