第14章:ドリル1~4

  • 投稿日:
  • by
  • カテゴリ:

 グラフィックスというよりは、C++の機能の解説の章である。なかなか読みごたえがあった。練習問題は、あまり面白そうな問題はないので、まじめにドリルをやることにした。
 まず、ドリル1~3の問題は下記の通り。

1.仮想関数vfと非仮想関数fを持つクラスB1を定義する。これらのクラスをB1クラスの内部で定義し、それぞれの名前(”B1::vf()”など)を出力するように実装する。これらの関数はpblicで宣言する。B1オブジェクトを作成し、これらの関数を呼び出す。
2.B1の派生クラスとしてD1を作成し、vf関数をオーバーライドする。D1オブジェクトを作成し、そこでvf関数とf関数とを呼び出す。
3.B1への参照(B!&)を定義し、それを作ほど定義したD1オブジェクトとして初期化する。その参照を使ってvf関数とf関数を呼び出す。

 問題文だけ読むと何が書いてあるのか、よくわからない。14.3.3の例題を参考に、作ったのが、以下の通り。

#include "..\..\std_lib_facilities.h"

struct B1 {
    virtual void vf() const { cout << "B1::vf()" << endl; }
    void f() const { cout << "B1::f()" << endl;; }
};


struct D1:B1 {
    void vf() const override { cout << "D1::vf()" << endl; }

};


int main() {
    B1 b1;
    D1 d1;

    b1.vf();
    b1.f();

    d1.vf();
    d1.f();

    B1& b{ d1 };
    b.vf();
    b.f();
}

 この時の出力結果は、

image

 

 ドリル4の問題は、以下の通り。

4.D1にfという関数を定義し、問題1~3を繰り返し、その結果を説明する。

 ほとんど、問題1~3と同様のコードになる。

#include "..\..\std_lib_facilities.h"

struct B1 {
    virtual void vf() const { cout << "B1::vf()" << endl; }
    void f() const { cout << "B1::f()" << endl;; }
};


struct D1 :B1 {
    void vf() const override { cout << "D1::vf()" << endl; }
    void f() const { cout << "D1::f()" << endl;; }
};


int main() {
    B1 b1;
    D1 d1;

    b1.vf();
    b1.f();

    d1.vf();
    d1.f();

    B1& b{ d1 };
    b.vf();
    b.f();
}

 出力は、

image

 

 ドリル1~3では、クラスD1にはf()を定義していないので、d1.f();では、B1で定義されたf()を実行する。一方、ドリル4では、D1でf()を定義したので、d1.f();ではD1で定義したf()が実行されている。