2017年9月13日水曜日

C++ 継承の使い方

一部だけ処理が異なるような複数のクラスを用意する際、継承を利用することで楽になる。

// Base.h
class Base {
public:
    int a_, b_;
    int ans_;
    Base(int a, int b) {
        a_ = a;
        b_ = b;
    }
    virtual void Calc() = 0;
    int Ans() {
        return ans_;
    }
}

// Add.h
#include "Base.h"
class Add : public Base {
public:
    Add(int a, int b) : Base(a, b) {
    }
    virtual void Calc() {
        ans_ = a_ + b_;
    }
}

// Sub.h
#include "Base.h"
class Sub : public Base {
public:
    Sub(int a, int b) : Base(a, b) {
    }
    virtual void Calc() {
        ans_ = a_ - b_;
    }
}

上記のように、基底クラスを作成し、変更したい関数を仮想関数にする。そのクラスを継承した派生クラスを作成、仮想関数を上書きすることで新しいクラスを作成することができる。

以下のように普通のクラスと同様にインスタンス生成が可能。
Add * add = new Add(2, 1);
Sub * sub = new Sub(2, 1);
add->Calc();
sub->Calc();
std::cout << add->Ans() << std::endl;
std::cout << sub->Ans() << std::endl;

派生クラスは基底クラスの型でもOK。
Base * add = new Add(2, 1);
Base * sub = new Sub(2, 1);

配列にすることもできる。
std::array<Base *, 2> calcs{new Add(2, 1), new Sub(2, 1)};
for(Base * calc : calcs) {
    calc->Calc();
    std::cout << calc->Ans() << std::endl;
}

配列にすることで順次処理が簡単になる。