C++

2013-03-04, cpp

仮想関数

継承クラスによるメソッドのオーバライド動作は、Javaなどのオブジェクト指向に慣れた人にとっては相当奇妙に見える部分ではないでしょうか。まず、以下のような親子関係のクラスを仮定します。

class Parent{
public:
    virtual void disp(); // 仮想関数
};

void Parent::disp()
{
    std::cout << "Parent" << std::endl;
}

class Child : public Parent{
public:
    void disp();
};

void Child::disp()
{
    std::cout << "Child" << std::endl;
}

そして、以下のコードを実行します。これは想定通りの動作をしてポリモーフィズムが実現されていることが分かります。このときに大事なのがdispの関数定義部に追加された「virtual」の指定です。これは指定したメンバ関数を「動的結合にする」と指示するもので、この指定がない場合は下記最下行のメソッドは親クラスの実装で動作してしまいます。

Parent parent;
Child child;
Parent* po;

po = &parent;
po->disp(); // Parent
po = &child;
po->disp(); // Child (virtualが付いていない場合、Parent)

なぜこんな仕様なのか、という部分は分かりませんでした。

参考URL

新Visual C++6.0入門 ビギナー編

この記事は役に立ちましたか?