http://studyhallweb.com/
プログラム学習室
[Home][C++言語]仮想関数のサンプル

C++言語 仮想関数のサンプル
仮想関数のサンプル
仮想関数を使うと、同じ関数名で異なる機能を実装できる
以下の例は、基底クラスclsBaseのtest関数を仮想関数とし、clsA, clsBで実装している
clsAのtest()とclsBのtest()は同じ関数名であるがその動作は異なる
オブジェクトによって動作を変えたい時、例えば一般社員と部長の給与計算式を変えたい時などに有効

// ======================================================================
// 基底クラス ヘッダー clsBase.h
// ======================================================================
#ifndef _INC_clsBase
#define _INC_clsBase

class clsBase{
protected:

public:
    virtual int test(int i);		// virtualをつける
};
#endif

// ======================================================================
// クラスA のヘッダー clsA.h
// ======================================================================
#ifndef _INC_clsA
#define _INC_clsA

#include "clsBase.h"

class clsA : public clsBase{
protected:

public:
    int test(int i);		// virtualはつけない
};
#endif

// ======================================================================
// クラスA
// ======================================================================
#include "clsA.h"

//
int clsA::test(int i)
{
    return i + 2;
}

// ======================================================================
// クラスB のヘッダー clsB.h
// ======================================================================
#ifndef _INC_clsB
#define _INC_clsB

#include "clsBase.h"

class clsB : public clsBase{
protected:

public:
    int test(int i);
};
#endif

// ======================================================================
// クラスB
// ======================================================================
#include "clsB.h"

//
int clsB::test(int i)
{
    return i * 2;
}


//***************************************************************************
//  仮想関数の例
//***************************************************************************

#pragma hdrstop

#include <iostream>
#include "clsA.h"
#include "clsB.h"

using namespace std;

//---------------------------------------------------------------------------

#pragma argsused

int funTest(clsBase &cFile ) {
	// clsA, clsB の基底クラスを引数とするとどちらでも受け取れる
    return cFile.test(4) ;
}

int main(int argc, char* argv[])
{
    clsA cA;
    clsB cB;

    cout << funTest(cA) << endl;	// clsAの結果 6 が表示される
    cout << funTest(cB) << endl;	// clsBの結果 8 が表示される
    return 0;
}
[Home][C++言語]仮想関数のサンプル