[C++]cpublicではなくprotectedやprivateを使おう!継承しよう!

妹「public:public:」
兄「妹のソースコードって、publicばかりが出てくるよね。どうしたの?」
妹「ぶっちゃけ違いがよくわからないし、たまにコンパイルエラーになるから全部パブリックってかけば問題ないでしょう?」
兄「いやいや、問題あるよ……。結果同じ事になっても、知っててそうするのと知らないままそうするのでコードが変ってくるよ」
妹「でも、お兄ちゃん。どれがpublicになってどれがprivateになって……って解らないよ」
兄「基本的には、全部privateだと思えばいい。ほら、プライベートって大切だろ?」
妹「そういうのはいいから、解説よろしくね」

sすすbす

兄「まず、これ。private,protected,publicに定義したよ」
妹「あれ、全部使えてるね。どれも同じ?」
兄「同じクラスからは全部使えるよ。使えないと変数にならないだろ?」
妹「使えるなら困らないね!じゃあプログラム書いてみる!」

妹「あれ、変数が出てこない?pubValueしかないよ!?コンパイルエラーが出た!使えない!?」
兄「そうだよ。mainはクラスの関数じゃないから見れるのはpubValueだけだよ」
妹「ダメじゃん!!!」
兄「ダメなのはお前だ。なんでクラス内関数に書かないんだよ。」
妹「privateとprotectedっていつ使うの?」
兄「privateは同一クラスの中で使う。protectedは継承先の中でも使う物が入る」
妹「派生クラス?」

兄「class定義の右に継承させたいクラスを記述する。この場合、clsTester:private clsTestと書いてるよね」
妹「継承先のクラスでは使えるんだね。でも不便だよ。priValueが使いたくなったらpublicに変えていいの?」
兄「ダメだってば」
妹「……ただしどうしても使いたい場合はpublicにしてもいい」
兄「なんだよその言い回しは……基本的には、そのクラスにあった定義をきちんとすれば困らないはずなんだ。もし困るとしたら、それは設計がおかしいんだよ。そのクラスの中に入るべき関数が外部に出てしまっている」
妹「ふむ……。あ、でもこの本を見ると、getやsetを使えって書いてある」
兄「変数を全てprivateに置くべき、という考え方だよ。そういう作り方をするとクラスが完成すると綺麗になるし解りやすいから」
妹「なるほど!SetPrivVal() SetProtVal()と!」


兄「……ただ、そういう風にすべての変数にアクセスできるアクセス関数を作ると意味がない。クラス定義が、アクセサで埋め尽くされているのは、きちんとクラスを設計できていないまま作るからだよ」
妹「……詳しく」
兄「じゃあ……詳しくは別の投稿でやるね」