純粋仮想関数に関するサンプル
純粋仮想関数とはオーバーライドされることを前提とした関数である。
だから基底クラスでインスタンス化できない。
基底クラスの型に継承したクラスの実態を代入できる。
この場合、基底クラスのメソッド及び、基底クラスで宣言した仮想関数を
オーバーライドした関数を使用できる。
ソース
#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歳