C++ 是关键字“引用”;虚拟的;传递给中间基类?

C++ 是关键字“引用”;虚拟的;传递给中间基类?,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,如果我从A导出B,从B导出C,如下所示: A | B | C 我很可能在A中有一个或多个虚拟函数。现在,我不小心忘记在B的函数声明中添加关键字virtual。但令我惊讶的是,它的工作原理好像虚拟也设置在B中。代码如下: #include <iostream> using std::cout; using std::endl; class A { public: virtual void foo(){cout << "A\n";}; }; class B

如果我从A导出B,从B导出C,如下所示:

A
|
B
|
C
我很可能在A中有一个或多个虚拟函数。现在,我不小心忘记在B的函数声明中添加关键字
virtual
。但令我惊讶的是,它的工作原理好像虚拟也设置在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;
}
否则就是这样

C
C
C
即使没有
B
中的
virtual


那么:关键字pinherite是否以某种方式存在?或者我理解这里有什么错误吗?

如果一个方法在基类中是
virtual
,那么它在其子类中是
virtual
,如果派生类中的方法签名与基类中的签名相同,则关键字virtual将自动继承。

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

函数是虚拟的,因为它的最上面的基声明它是虚拟的,派生成员函数是虚拟的,不管它是否被隐式声明

§10.3.2虚拟功能

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


你肯定有一本参考书吗?也许太早了,但我没有找到答案。。。
C
C
C