2013-09-30 36 views
2

如果我从A和C获得B,从b类似这样:关键字“虚拟”是否传递给中间基类?

A 
| 
B 
| 
C 

很可能我会在A.一个或多个虚拟功能现在,无意中我忘了把关键字virtual B中的函数声明。但让我吃惊它的工作原理是,如果虚拟也设置B.这是代码:

#include <iostream> 

using std::cout; 
using std::endl; 

class A 
{ 
public: 
    virtual void foo(){cout << "A\n";}; 
}; 

class B : public A 
{ 
public: 
    void foo(){cout << "B\n";} // a "virtual doesn't change the behaviour... 
}; 

class C : public B 
{ 
public: 
    void foo(){cout << "C\n";} 
}; 

int main() 
{ 
    C c; 
    c.foo(); 

    A *pa = new C; 
    pa->foo(); 

    B *pb = new C; 
    pb->foo(); 

    return 0; 
} 

如果还省略了virtualA,输出

C 
A 
B 

否则是

C 
C 
C 

即使没有virtualB

所以:是关键字以某种方式pinherited?或者我在这里理解错误吗?

+0

当然,你有一本参考书? –

+0

也许现在太早了,但我没有找到答案... – steffen

回答

4

如果一个方法是基类中的virtual,那么它的子类中就是virtual,而不必像这样声明它。

1

如果在派生类方法签名是相同的基类,则关键字虚拟的签名将被自动继承。

3

如果一个成员被声明在一个类virtual,它是在它的派生类virtual。在派生类中标记方法virtual不是必需的,但可用于文档目的。在C++ 11中,使用override会使这种冗余。

3

功能是虚拟的,因为其最高基础声明为虚拟和派生成员函数是虚拟的都无所谓它隐含或不重新申报。

§10.3.2虚函数

如果虚拟成员函数VF在类Base和在派生的类声明,直接或间接从碱衍生,成员函数VF具有相同名称,参数类型列表(8.3.5),CV-资格,和refqualifier(或不存在的相同)基地:: VF被声明,然后派生:: VF也是虚拟(它是否被这样声明)。