仮想関数!!!

はじめに

恥しながら,C++を仕事で使いつつ,仮想関数・純粋仮想関数をあいまいに使ってた. ただ,シルバーウィークに入る前,ボスにC++の再学習(文法とかじゃなくて,設計とか)を命じられたので「憂鬱な…」を読んでる.

www.amazon.co.jp

この本の6章で仮想関数に対する理解が爆発的に進んだのでメモしておきたい.

何か

仮想関数

一言でいうと,別のメンバ関数で使ってるけど,実装は一番派生側を使いたい,そのとき,virtualを付けて仮想関数にする.

純粋仮想関数

  • 基底クラス内のあるメンバ関数で別のメンバ関数を使いたい.
  • しかし,実装の詳細は派生クラスに任せたい.
  • このままだとコンパイルできない.
  • そんなときの純粋仮想関数!
  • 純粋仮想関数は派生クラスで絶対に実装する必要がある.

Shapeを基底クラス,Circleを派生クラスとする.

#include <iostream>

class Shape {
        public:
                virtual void refresh() {draw();};
                virtual void draw() = 0;
};

class Circle : public Shape {
        public:
                Circle(double radius);
                virtual void draw();
        private:
                double radius;
};

Circle::Circle(double radius) {
        this->radius = radius;
}

void Circle::draw() {
        std::cout << "Raidus is " << this->radius << std::endl;                    }

int main(int argc, char const* argv[])
{                                                                                          Circle c = Circle(1.0);
        c.draw();
        c.refresh();
        return 0;
}

実行すると,半径が二回表示される. つまり,Circleのdrawが使われる.