4

ヘッダーファイル「testcode.h」があります

#ifndef TESTCODE_H
#define TESTCODE_H

class A
{
public:
    A();
    ~A();
    virtual void Foo();

public:
    int mPublic;

protected:
    int mProtected;

private:
    int mPrivate;
};

class B : public A
{
public:
    B();
    ~B();
    void Foo();
};

#endif // TESTCODE_H

とソースファイル

#include "TestCode.h"

int main(int argc, char* argv[])
{
    A* b = new B();
    b->Foo();

    b->mPublic = 0;
    b->mProtected = 0;
    b->mPrivate = 0;

    delete b;

    return 0;
}

ここで、「b->Foo」を呼び出しているときに、クラス A の代わりにクラス B の Foo 関数が呼び出されることを知りたいのですが、クラス B の Foo 関数は virtual として宣言されていません。誰でもこれについて詳しく説明できますか??

4

2 に答える 2

8

virtual関数が基底クラスで仮想として宣言されると、キーワードが派生クラスの関数で使用されているかどうかは問題になりません。派生クラスでは常に仮想です (そのように宣言されているかどうかに関係なく)。

C++11 標準、10.3.2 から:

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

于 2012-05-23T00:55:04.483 に答える
3

B::Fooは仮想として宣言する必要はありません。これA::Fooが仮想であり、B が A から派生しているという事実は、それが仮想 (およびオーバーライド) であることを意味します。詳細については、仮想関数に関するmsdn の記事を参照してください。

于 2012-05-23T00:55:14.433 に答える