仮想関数:
→何のためにあるっけ?
・派生先で関数を上書きするための準備として宣言する。
・逆に言うと、ベースクラス(親クラス)で仮想関数を
書いておかないとただの隠蔽になっちゃうよ
(関数の上書きじゃなく、親クラスと子クラスに同じ名前
の関数が2つある状態。これはこれで使えなくもないよ)
→親クラスでvirtualつけた関数は実装しなくていい?
・親クラスの実装も使いたいときは、実装する
・完全に「インターフェース」として使うなら純粋仮想関数にする
純粋仮想関数=> virtual 関数名(引数) = 0;
純粋仮想関数は、派生先でしか実装できない。
・純粋仮想関数を含むクラスを(抽象クラス)という。
抽象クラスは、インスタンスを作れない
=派生させるしかない=インターフェースとして使うしかない
#pragma once
#include <iostream>
using namespace std;
//using std::cout;
//using std::endl;
class cBase
{
private:
int* kamoku;//科目数の配列へのポインタ
public:
//年齢
int m_age;
//身長
double m_height;
cBase()
:m_age(0), m_height(0),kamoku(nullptr)
{
//cout << "cBase:コンストラクタ" << endl;
printf("cBase:コンストラクタ\n");
}
cBase(int _age, double _height, int _kamoku)
:m_age(_age), m_height(_height)
{
kamoku = new int[_kamoku];
cout << "cBase:コンストラクタ\n";
}
~cBase();
};
#include "cBase.h"
//デストラクタは引数なし、戻り値なしの
//超特別な関数
cBase::~cBase()
{
//メモリリークをしないために
//自分の動的に作ったものの後片付け
//もの=動的なメンバ(配列、変数)
if(kamoku != nullptr) delete[] kamoku;
cout << "デストラクタ:cBase\n";
}
theMain.cpp
#include "cBase.h"
int main()
{
//cBase yamada;
cBase *yamada = nullptr;
//yamada = new cBase(18, 164.2);
////newはコンストラクタを呼んで出来た実体の
////アドレスを返す演算
while (true) {
cBase yamada(19,168.5,2000);
//自分で取得したメモリは自分で後片付けしないとメモリ漏れを起こす
//クラス内で動的に取得したメモリは、デストラクタでお片づけをする。
//yamada = new cBase(19,169.5, 1000);
//delete[] yamada;
//delete[] yamada->kamoku;
//delete yamada;
}
//delete yamada;
////newしたものは自分で消す。
return 0;
}