2

如果我像这样从 A 和 C 从 B 导出 B:

A
|
B
|
C

很可能我会在 A 中拥有一个或多个虚函数。现在,我不小心忘记将关键字virtual放在 B 的函数声明中。但令我惊讶的是,它就像在 B 中设置了 virtual 一样工作。这是代码:

#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;
}

如果您也省略virtualin A,则输出为

C
A
B

否则就是

C
C
C

即使没有virtualin B

那么:关键字是否以某种方式被继承?还是我在这里理解错误?

4

4 回答 4

4

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

于 2013-09-30T09:18:06.750 回答
4

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

于 2013-09-30T09:18:31.087 回答
3

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

§ 10.3.2 虚拟功能

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

于 2013-09-30T09:26:09.133 回答
1

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

于 2013-09-30T09:18:26.500 回答