Cpp クラス 継承のソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[C PlusPlus#C++からの技術|C++]]に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ クラス 継承</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </tr> </table> ※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが<nowiki>C++ クラス 継承</nowiki>になっています。<br /> <br /> == '''クラス 継承''' == 根幹となる主要な処理や機能をもったクラスに対して、そのクラスをうまく使うようなクラスを作ったり、根幹となるクラスをもとに、いくつかの機能をもつクラスを作ったりするのに使う技術が継承です。英語では<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">インヘリタンス(inheritance)</span>と言います。根幹となるクラスは<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">基底クラス</span>と呼ばれていて、その基底クラスを内包する新しく作るクラスを<span style = "background:linear-gradient(transparent 50%, #ff7f7f 50%); font-weight:bold; ">派生クラス</span>と言います。 初めて継承という言葉を聞く人はそれって便利なの?って思ったかもしれない。なぜなら、若かりし頃、自分もそれって便利なのみたいな感じでした。継承の技術だけを教えてもらったからなのかもしれない。具体的な活用例って大事なんだなと思うところです。だがしかし!具体的な利用例を考えると以上にながくなるのがサンプルプログラム。継承の説明をしているので、サンプルプログラム全体を見通す必要があり、バランスが大事。カンタンなサンプルで且つ、継承が有意義なプログラムに感じる説明が必要になるのです。でも有意義なプログラムって難しくなり勝ちだから、やっぱ、簡便なものを最初は紹介したいと思います。つまり、サンプルは技術を知るためだけの悪い使い方です。有意義な使い方についてはかなり先になってから、もう一度考えようかなって思ってます。 以下のような毎月のサブスクリプション(月額契約)金額と使用した月数を受け取って、使用した月における合計金額を算出するクラスがあったとします。モノは言いようで、ただの掛け算をするだけのクラスです。 <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>BaseInheritance.h<span>)</span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line> #ifndef __BASEINHERITANCE_H_YONET__ #define __BASEINHERITANCE_H_YONET__ #if _MSC_VER > 1000 #pragma once #endif class CBaseInheritance { protected: int m_iBaseMoney; int m_iBaseMonth; CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth); ~CBaseInheritance(); private: void m_fvBaseDispValue(); public: int m_fiBaseSumMoney(); }; #endif </syntaxhighlight2> <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>BaseInheritance.cpp<span>)</span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line> #include <cstdio> #include "BaseInheritance.h" CBaseInheritance::CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth) { m_iBaseMoney = iArgBaseMoney; m_iBaseMonth = iArgBaseMonth; printf("Constructor:CBaseInheritance\n"); } CBaseInheritance::~CBaseInheritance() { printf("Destructor:~CBaseInheritance\n"); } void CBaseInheritance::m_fvBaseDispValue() { printf("Money=%d\n", m_iBaseMoney * m_iBaseMonth); } int CBaseInheritance::m_fiBaseSumMoney() { return (m_iBaseMoney * m_iBaseMonth); } </syntaxhighlight2> 上記のクラスを呼び出すだけで、掛け算をした結果が得られます。 <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>BaseInheritanceMain.cpp<span>)</span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line> #include <cstdio> int main() { CBaseInheritance objCBaseInheritance(3900, 12); return 0; } </syntaxhighlight2> <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">処理結果 </span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="text" line> Constructor:CBaseInheritance Money=46800 Destructor:~CBaseInheritance </syntaxhighlight2> と上記のようなメインクラスでの利用をすれば、合計金額が表示されます。これに派生クラスを作りましょう。イメージとしては、この毎月の支払にオプションの利用料金が取られることを考えたようなクラスにしましょう。毎月毎月発生する金額を計算するということが根底にあって、その上にオプション料金を計算するという機能を付け足すので一応継承した感じにしました。ですが、簡単に言えば、合計金額にオプションの金額を足して表示するだけです。機能は何も利用しないので、おそろしくダメな継承ですね。 でも、勉強だし、簡単なので、やってみましょう。まずは派生させたヘッダファイルを作ります。 <span style="color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;">cpp <span>(</span>DeriveInheritance.h<span>)</span><!-- padding 上 右 下 左--> <syntaxhighlight2 lang="cpp" line> #ifndif __DERIVEINHERITANCE_H_YONET__ #defint __DERIVEINHERITANCE_H_YONET__ #if _MSC_VER > 1000 #pragma once #endif class CDeriveInheritance:public CBaseInheritance{ private: int m_iDeriveMoney; CDeriveInheritance(int iArgDeriveMoney, int iArgDeriveMonth, int iArgOptionMoney); ~CDeriveInheritance(); public: void m_fvDeriveDispValue(); int m_fiDeriveSumMoney(); }; #endif </syntaxhighlight2> こんな感じの関数を定義してみようと思います。この中で新しい表記は一か所だけです。7行目の <syntaxhighlight2 lang="cpp"> class CDeriveInheritance:public CBaseInheritance{ </syntaxhighlight2> この部分が継承を定義している部分です。:の後ろに基底クラス名を記述しています。:の前は派生クラス名ということになります。基底クラス名の後ろにpublicというキーワードがありまして、基底クラスの中で設定されているアクセス指定子(private、protected、public)を一括で制限させる役割があります。publicに設定しておけば、基底クラスのアクセス指定子どおりになります。基底クラスと派生クラスは一つのクラスのような状態になりますが、別々のクラスとして区分けがあります。なので基底クラスでprivateとされていれば、派生クラスからはアクセスできません。protectedにはアクセスできます。public以外に設定するとアクセス指定子が派生クラスでの扱いが変わり、派生クラスの外への権限を一括変更できます。継承におけるアクセス指定子の働きの具体的な扱いの細かい部分ははこの先で紹介するクラスの機能を踏まえると複雑なので、ここでは深く触れないことにします。基底クラスのアクセス指定子を変更できるとだけと覚えておくのがよいと思います。ここまでの知識しかない現状では、そういうことにしておきましょう。 [[VC PlusPlus:サブシステムとエントリポイント]]にmain関数の名前を変えることができるという内容の文献がありますので、そのような技術を使って変な名前のmain関数を作成してると思ってください。皆さんは自分でmainに変えて実行して下さい。 [[C PlusPlus#C++からの技術|C++]]に戻る
テンプレート:記事名の制約
(
ソースを閲覧
)
Cpp クラス 継承
に戻る。
個人用ツール
3.134.81.178
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ