[C++] 純粋仮想関数(pure virual function)

純粋仮想関数は仮想関数の宣言の最後に =0という指定をつけたもの
純粋仮想関数を1つでも持つ抽象クラスはオブジェクトを作成できない。

class Vehicle {
    protected:
        int speed;
    public:
        void setSpeed(int s);
        virtual void show() = 0;
};

class Car : public Vehicle {
    private:
        int num;
        double gas;
    public:
        Car(int n, double g);
        void show();
};

class RacingCar : public Car {
    private:
        int course;
    public:
        RacingCar();
        void setCourse(int c);
        void show();
};

class Plane : public Vehicle {
    private:
        int flight;
    public:
        Plane(int f);
        void show();
};

void Vehicle::setSpeed(int s){
    speed = s;
    cout << "速度を" << speed << "にしました。\n";
}

Car::Car(int n, double g) {
    num = n;
    gas = g;
    cout << "ナンバー" << num  << "ガソリン量" << gas << "の車を作成しました。\n";
}

void Car::show(){

    cout << "車のナンバーは" << num << "です。\n";
    cout << "ガソリン量は" << gas << "です。\n";
    cout << "速度は" << speed << "です。\n";
}

Plane::Plane(int f) {
    flight = f;
    cout << "便" << flight << "の飛行機を作成しました。\n";
}

void Plane::show() {
    cout << "飛行機の便は" << flight << "です。\n";
    cout << "速度は" << speed << "です。\n";
}


int main() {
    
    Vehicle* pVc[2];

    Car car1(1234, 20.5);
    pVc[0] = &car1;
    pVc[0]->setSpeed(60);

    Plane pln1(232);
    pVc[1] = &pln1;
    pVc[1]->setSpeed(500);

    for(int i=0; i<2; i++){
        pVc[i]->show();
    }

    return 0;
}

typeid演算子でオブジェクトのclassを調べることができる。
ヘッダにtypeinfoをインクルードする

int main() {
    
    Vehicle* pVc[2];

    Car car1(1234, 20.5);
    pVc[0] = &car1;

    Plane pln1(232);
    pVc[1] = &pln1;

    for(int i=0; i<2; i++) {
        if(typeid(*pVc[i]) == typeid(Car))
            cout << (i+1) << "番目は" << typeid(Car).name() << "です。\n";
        else
            cout << (i+1) << "番目は" << typeid(Car).name() << "ではありません。" << typeid(*pVc[i]).name() <<"です。\n";
    }

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
ナンバー1234ガソリン量20.5の車を作成しました。
便232の飛行機を作成しました。
1番目は3Carです。
2番目は3Carではありません。5Planeです。

typeid(Car).name()だとoutputがおかしい。