Awesome Hacks!

プログラミング初心者なので地道に勉強していきます。分からない人の立場から整理していきます。

クラスの基本_純粋仮想関数

そのままでは使わない基本クラスを準備し、それをもとに派生させて様々なクラスを作るとき、同じ名前の関数でクラスによって異なる動きをする関数を実装したいとき、基本クラスにその関数をとりあえず作成する。
しかし基本クラスでは使わないので、宣言のみで処理は実装する必要がない。
そのような関数を純粋仮想関数という。
純粋仮想関数を持つ基本クラスは抽象クラスといい、抽象クラスのオブジェクトは生成できない。


 
以下のような場合、Humanクラスが抽象クラスとなる。
 

#include <iostream>
#include <string>
using namespace std;

class Human {
    public:
        virtual void outMes() = 0;    // 純粋仮想関数
};

class Student : public Human {
    private:
        string name;
    public:
        Student(string s) : name(s){}
        void outMes() {
            cout << "Studentクラスです" << endl;
            cout << "名前 : " << name << endl;
        }
};

class Teacher : public Human {
    private:
        int num;
    public:
        Teacher(int n) : num(n){}
        void outMes(){
            cout << "Teacherクラスです" << endl;
            cout << "番号 : " << num << endl;
        }
};

int main(){
//  Human h;         // コンパイルエラー(抽象クラスのオブジェクトは作れない) 
    
//  Human h*;
//  h->outMes();    // セグメントフォルト(抽象クラスのポインタは作れてもアクセスできない)

    Human *s, *t;
    s = new Student("五郎");
    t = new Teacher(555);
    s->outMes();
    t->outMes();

    return 0;
}