Cpp クラス 仮想関数 新しいページはコチラ
提供: yonewiki
(→クラス 仮想関数) |
(→クラス 仮想関数) |
||
11行: | 11行: | ||
<br /> | <br /> | ||
== '''クラス 仮想関数''' == | == '''クラス 仮想関数''' == | ||
− | + | 前の項目の[[Cpp クラス 継承 アップキャスト]]で、デストラクタが呼ばれず、プログラムがメモリリークを起こすような怪しい終わり方になっていました。その対策方法を「継承 デストラクタ」の項目で説明するつもりなのですが、対策をするには、この仮想関数という仕組みを理解する必要があります。 | |
− | + | ざっくり言うと、基底クラス側で、派生クラスでも同じ名前の関数を作ってもいいよ。っていうメカニズムです。今回作った継承のサンプルだと基底クラスの機能があまりにも少ないので、基底クラスに仮想関数を設定しにくいので、もう少し肉付けしてみます。 | |
+ | |||
+ | |||
+ | いい感じのサンプルになるかな?例えば、これまでに作ったプログラムでは、アップキャストしても基底クラスで保有している関数しか使えないため、基本料金の合計(月額料金×利用月数)と全体の合計金額しか表示することが出来ていませんでした。オプション料金が発生したときは、ちゃんとオプション料金がいくらだったのかを表示してほしいとします。そうすると、「基本料金、合計金額」という出力ではなく、「基本料金、オプション明細、合計金額」というような出力をする関数が欲しいところです。この仕組みを実現するために、まずは基底クラス | ||
+ | |||
+ | |||
+ | <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 { | ||
+ | #ifndef __BASEINHERITANCE_H_YONET__ | ||
+ | #define __BASEINHERITANCE_H_YONET__ | ||
+ | #if _MSC_VER > 1000 | ||
+ | #pragma once | ||
+ | #endif | ||
+ | |||
+ | class CBaseInheritance { | ||
+ | protected: | ||
+ | int m_iBaseMoney = 0; | ||
+ | int m_iBaseMonth = 0; | ||
+ | int m_iMoney = 0; | ||
+ | int mf_iBaseSumMoney(); | ||
+ | public: | ||
+ | CBaseInheritance(); | ||
+ | CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth); | ||
+ | ~CBaseInheritance(); | ||
+ | void mfVirtual_vDispValue(); | ||
+ | void mf_vBaseDispValue(); | ||
+ | }; | ||
+ | </syntaxhighlight2> | ||