トップ-> C++入門:6章 継承-> 純粋仮想関数

←前ページへ :  トップへ :  次ページへ→

8. 純粋仮想関数

// 親クラス
class Base{
public:
    virtual void func() = 0;
};

// 子クラス
class Deriv : public Base{
public:
    virtual void func(){
        cout << "Deriv::func" << endl;
    }
};

void main(){
    Base*  pBase1 = new Deriv();  // OK
    Base*  pBase2 = new Base();   // エラー

    Base  base;                   // エラー
    Deriv deriv;                  // OK

    delete pBase1;
    delete pBase2;
}

  上記の例のように仮想関数の末尾に「=0」と付けた関数は純粋仮想関数と呼ぶ。 純粋仮想関数を1つでも含むクラスは抽象クラスまたはアブストラクトクラス よ呼び、インスタンスを作ることができない。

  基底クラスに純粋仮想関数が複数ある場合、すべての純粋仮想関数を派生クラスで実装しなければ その派生クラスもまた抽象クラスになる。

// 親クラス
class Base{
public:
    virtual void func1() = 0;
    virtual void func2() = 0;
};

// 子クラス(まだ抽象クラス)
class Deriv : public Base{
public:
    virtual void func1(){
        cout << "Deriv::func1" << endl;
    }
};

// さらに子クラス
class DDeriv : public Deriv{
public:
    virtual void func2(){
        cout << "DDeriv::func2" << endl;
    }
};
void main(){
    Base   base;                   // エラー
    Deriv  deriv;                  // エラー
    DDeriv dderiv;                 // OK
}

  抽象クラスは概念として導入する場合が多いです。つまりお絵かきソフトを作ろうと 考えた場合、図形データはVectorクラスに入れます。 図形データは以下のように作ります。
// 図形クラス(抽象クラス)
class Zukei{
protected:
    int x1, x2, y1, y2;
public:
    // 描画する関数
    virtual void draw() = 0;

    // セーブする関数
    virtual ostream& save(ostream& os) = 0;
};

// 四角形クラス
class Rectangle : public Zukei{
public:
    // 描画する関数(このクラスで実装する)
    virtual void draw();

    // セーブする関数(このクラスで実装する)
    virtual ostream& save(ostream& os);
};

// 直線クラス
class Line : public Zukei{
public:
    // 描画する関数(このクラスで実装する)
    virtual void draw();

    // セーブする関数(このクラスで実装する)
    virtual ostream& save(ostream& os);
};

// 円クラス
class Circle : public Zukei{
public:
    // 描画する関数(このクラスで実装する)
    virtual void draw();

    // セーブする関数(このクラスで実装する)
    virtual ostream& save(ostream& os);
};

  図形を描画したい場合は、Vectorクラスのすべてのデータに対してdraw関数を呼べば 良いだけです。セーブしたいときもVectorクラスの全てのデータに対してsave関数を呼べば 良いだけです。抽象クラスはこのように、いくつかのデータクラスなどの親分役として作ります。



←前ページへ :  トップへ :  次ページへ→