仮想関数
親クラスで子クラスを呼ぶためのもの
virtualをつけると仮想になる。
bird.h
#pragma once #include <iostream> #include <string> using namespace std; class CBird { public: virtual void sing() { cout << "鳥が鳴きます" << endl; }; void fly() { cout << "鳥が飛びます" << endl; }; };
CChiecken.h
#pragma once #include "bird.h" class CChicken:public CBird { public: void sing() { cout << "コケコッコー" << endl; }; void fly() { cout << "にわとりは飛べません" << endl; }; };
main.cpp
#include <iostream> #include "bird.h" #include "CChicken.h" using namespace std; int main() { CBird *bird = 0; bird = new CBird(); bird->sing(); bird->fly(); //オーバーライド CChicken* chicken = 0; chicken = new CChicken(); chicken->sing(); chicken->fly(); //CBirdでCChickenクラスを呼ぶ CBird* bird_checken = 0; bird_checken = new CChicken(); bird_checken->sing(); bird_checken->fly(); }
純粋仮想関数、抽象クラス、仮想デストラクタ
抽象クラスの場合、仮想デストラクタでないとデストラクタが呼ばれないようなですね。
sup1.h
#pragma once #include <iostream> using namespace std; //純粋仮想関数があるクラスを抽象クラスという class Csup1 { public: Csup1() { cout << "CCsup1のコンストラクタ" << endl; }; //純粋仮想関数 virtual void test()=0; //抽象クラスの場合、virtualをつけないとデストラクタが呼ばれない virtual ~Csup1() { cout << "CCsup1のデストラクタ" << endl; }; };
sub1.h
#pragma once #include "sup1.h" class Csub1:public Csup1 { public: Csub1() { cout << "CCsub1のコンストラクタ" << endl; }; void test(){ cout << "sub1のテスト関数" << endl; }; ~Csub1() { cout << "CCsub1のデストラクタ" << endl; }; };
main.cpp
#include <iostream> #include "sup1.h" #include "sub1.h" using namespace std; int main() { Csup1* s1 = new Csub1(); s1->test(); delete s1; }