日記

ただの日記

純粋仮想関数に関するサンプル

純粋仮想関数とはオーバーライドされることを前提とした関数である。
だから基底クラスでインスタンス化できない。

基底クラスの型に継承したクラスの実態を代入できる。
この場合、基底クラスのメソッド及び、基底クラスで宣言した仮想関数を オーバーライドした関数を使用できる。

ソース

#include<iostream>

using namespace std;

// 動物(基底クラス)
class Animal {
public:
    Animal(int age);
    void get_age();
    virtual void hello() = 0; //純粋仮想関数
protected:
    int age;
};

Animal::Animal(int age) : age(0) {
    this->age = age;
}

void Animal::get_age() {
    cout << "御年" << this->age << "歳" << endl;
}

// 犬
class Dog : public Animal {
public:
    Dog(int age) : Animal(age) {}
    void hello();
    void bark();
};

void Dog::hello() {
    cout << "ワンワンお" << endl;
}

void Dog::bark() {
    cout << "バウバウバウバウ" << endl;
}

// 猫
class Cat : public Animal {
public:
    Cat(int age) : Animal(age) {}
    void hello();
};

void Cat::hello() {
    cout << "猫です。" << endl;
}

int main() {
    // 純粋仮想関数を含むクラスは実体化できない
    // Animal *animal = new Animal(30);

    Dog *dog = new Dog(10);
    dog->hello();
    dog->bark();
    dog->get_age();

    Cat *cat = new Cat(15);
    cat->hello();
    cat->get_age();

    // ベースとなるクラスを型とする変数に代入できる
    // 継承時に追加したメソッドは使えないが、
    // 仮想関数を用意していた場合は使用できる
    Animal *animal = new Dog(5);
    animal->hello(); //Animal型からDog::helloを呼び出せる
    animal->get_age();
    //animal->bark(); //犬クラスの関数は使えない

    delete dog, cat, animal;
    system("pause");
    return 0;
}

実行結果

ワンワンお
バウバウバウバウ
御年10歳
猫です。
御年15歳
ワンワンお
御年5歳