2

A から B を派生させ、B から C を次のように派生させた場合:

A
|
B
|
C

virtualほとんどの場合、A に 1 つまたは複数の仮想関数が含まれます。ここで、うっかり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;
}

virtualinも省略するAと、出力は次のようになります。

C
A
B

そうでなければ

C
C
C

なくてvirtualB

だから:キーワードは何らかの方法で固定されていますか?それとも、ここで何か間違っていることを理解していますか?

4

4 に答える 4

3

関数は、最上位のベースがそれを仮想として宣言し、派生メンバー関数が暗黙的に再宣言されているかどうかに関係なく仮想であるため、仮想です。

§ 10.3.2 仮想関数

仮想メンバー関数 vf がクラス Base およびクラス Derived で宣言され、Base から直接的または間接的に派生した場合、同じ名前、parameter-type-list (8.3.5)、cv-qualification、およびBase::vf として refqualifier が宣言されている (または同じものがない) 場合、Derived::vf も仮想です (そのように宣言されているかどうかに関係なく)。

于 2013-09-30T09:26:09.133 に答える