关键字“virtual”是否传递给中间基类?

时间:2013-09-30 09:16:47

标签: c++ inheritance virtual-functions

如果我从A中得到B,那么从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;
}

如果省略virtual中的A,则输出为

C
A
B

否则就是

C
C
C

即使没有virtual中的B

那么:关键字是否以某种方式发送?或者我在这里理解错误了吗?

4 个答案:

答案 0 :(得分:4)

如果一个方法在基类中是virtual,那么它的子类中就是virtual,而不必将它们声明为它。

答案 1 :(得分:4)

如果某个成员在类中声明为virtual,则其派生类中的成员为virtual。在派生类中标记方法virtual不是必需的,但可能用于文档目的。在C ++ 11中,使用override会使这变得多余。

答案 2 :(得分:3)

一个函数是虚拟的,因为它的最顶层基础将其声明为虚拟,派生成员函数是虚拟的,无论它是否隐式重新声明。

§10.3.2虚函数

  

如果虚拟成员函数vf在类Base和Derived类中声明,直接或间接从Base派生,则成员函数vf具有相同的名称,参数类型列表(8.3.5),cv-声明了Base :: vf的限定和refqualifier(或不存在相同的),然后Derived :: vf也是虚拟的(无论是否声明)。

答案 3 :(得分:1)

如果派生类中的方法签名与基类中的签名相同,则关键字virtual将自动继承。