<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://twiki.yo-net.jp/index.php?action=history&amp;feed=atom&amp;title=Cpp_%E3%82%AF%E3%83%A9%E3%82%B9_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9</id>
	<title>Cpp クラス 抽象クラス - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://twiki.yo-net.jp/index.php?action=history&amp;feed=atom&amp;title=Cpp_%E3%82%AF%E3%83%A9%E3%82%B9_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9"/>
	<link rel="alternate" type="text/html" href="https://twiki.yo-net.jp/index.php?title=Cpp_%E3%82%AF%E3%83%A9%E3%82%B9_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;action=history"/>
	<updated>2026-04-05T19:58:37Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://twiki.yo-net.jp/index.php?title=Cpp_%E3%82%AF%E3%83%A9%E3%82%B9_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;diff=117&amp;oldid=prev</id>
		<title>Yo-net: ページの作成:「C++に戻る   &lt;table class=&quot;mbox-small&quot; style=&quot;border:1px solid #aaa; background-color:#f9f9f9; width:22em;&quot; id=&quot;RealTitleBanner&quot;&gt; &lt;tr&gt; &lt;td style=&quot;width:1px;&quot;&gt;&lt;/td&gt; &lt;td class=&quot;mbox-text plainlist&quot; style=&quot;&quot;&gt;本来の表記は「&lt;b&gt;&lt;span id=&quot;RealTitle&quot; style=&quot;font-size:large;&quot;&gt;C++(Cpp) クラス 抽象クラス&lt;/span&gt;&lt;/b&gt;」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなってい…」</title>
		<link rel="alternate" type="text/html" href="https://twiki.yo-net.jp/index.php?title=Cpp_%E3%82%AF%E3%83%A9%E3%82%B9_%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9&amp;diff=117&amp;oldid=prev"/>
		<updated>2022-09-26T02:30:55Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「&lt;a href=&quot;/C_PlusPlus#C++からの技術&quot; title=&quot;C PlusPlus&quot;&gt;C++&lt;/a&gt;に戻る   &amp;lt;table class=&amp;quot;mbox-small&amp;quot; style=&amp;quot;border:1px solid #aaa; background-color:#f9f9f9; width:22em;&amp;quot; id=&amp;quot;RealTitleBanner&amp;quot;&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td style=&amp;quot;width:1px;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td class=&amp;quot;mbox-text plainlist&amp;quot; style=&amp;quot;&amp;quot;&amp;gt;本来の表記は「&amp;lt;b&amp;gt;&amp;lt;span id=&amp;quot;RealTitle&amp;quot; style=&amp;quot;font-size:large;&amp;quot;&amp;gt;C++(Cpp) クラス 抽象クラス&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなってい…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[C PlusPlus#C++からの技術|C++]]に戻る&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;mbox-small&amp;quot; style=&amp;quot;border:1px solid #aaa; background-color:#f9f9f9; width:22em;&amp;quot; id=&amp;quot;RealTitleBanner&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;width:1px;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;mbox-text plainlist&amp;quot; style=&amp;quot;&amp;quot;&amp;gt;本来の表記は「&amp;lt;b&amp;gt;&amp;lt;span id=&amp;quot;RealTitle&amp;quot; style=&amp;quot;font-size:large;&amp;quot;&amp;gt;C++(Cpp) クラス 抽象クラス&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが&amp;lt;nowiki&amp;gt;C++ クラス 抽象クラス&amp;lt;/nowiki&amp;gt;になっています。&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
== '''クラス 抽象クラス''' ==&lt;br /&gt;
　抽象クラスは、単体ではもう機能しないような基底クラスになってしまう手法で、先の記事で説明した仮想関数を使う時に基底クラスにはプログラムの実体を持たない方法です。[[Cpp クラス 仮想関数]]で使っていたプログラムでは基底クラスは２箇所をvirtualキーワードで仮想関数にしていましたが、そのうちのmfVirtual_vDispValue()に変更して、基底クラスだったCBaseInheritanceを抽象クラスにしたいと思います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　まずは元々の基底クラスはこうだったという例を示します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;&amp;quot;&amp;gt;cpp &amp;lt;span&amp;gt;(&amp;lt;/span&amp;gt;基底クラス BaseInheritance.h&amp;lt;span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;!-- padding 上 右 下 左--&amp;gt;&lt;br /&gt;
&amp;lt;Syntaxhighlight lang=&amp;quot;cpp&amp;quot; line start=1&amp;gt;&lt;br /&gt;
#ifndef __BASEINHERITANCE_H_YONET__&lt;br /&gt;
#define __BASEINHERITANCE_H_YONET__&lt;br /&gt;
#if _MSC_VER &amp;gt; 1000&lt;br /&gt;
#pragma once&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
class CBaseInheritance {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_iBaseMoney = 0;&lt;br /&gt;
    int m_iBaseMonth = 0;&lt;br /&gt;
    int m_iMoney = 0;&lt;br /&gt;
    int mf_iBaseSumMoney();&lt;br /&gt;
public:&lt;br /&gt;
    CBaseInheritance();&lt;br /&gt;
    CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth);&lt;br /&gt;
    virtual ~CBaseInheritance();&lt;br /&gt;
    virtual void mfVirtual_vDispValue();&lt;br /&gt;
    void mf_vBaseDispValue();&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/Syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　基底クラスの仮想関数がありましたが、基本料金が0円だったかどうかも、必ず知りたいとしたら、オプションが0円だったということも含めて呼びだされたいため、このクラスがそのまま使われるとまずいという考え方もできます。基底クラスが直接呼ばれたら、オプション料金の設定忘れということになってしまいます。ならば、基本料金を返却表示してしまう部分は派生クラスでプログラムされて、かつ基底クラスではプログラムを持たない形式にすると良いと考えることが出来ます。こういった、基底クラスの関数が派生クラスに全投げする状態の関数を純粋仮想関数と言います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　純粋仮想関数として定義するのも仮想関数がvirtualというキーワードを付けるだけだったの同様に簡単で、仮想関数を0で初期化することで、宣言だけで、プログラムを持つ必要がなくなります。具体的には以下のようになります。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;&amp;quot;&amp;gt;cpp &amp;lt;span&amp;gt;(&amp;lt;/span&amp;gt;基底クラス BaseInheritance.h&amp;lt;span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;!-- padding 上 右 下 左--&amp;gt;&lt;br /&gt;
&amp;lt;Syntaxhighlight lang=&amp;quot;cpp&amp;quot; line start=101&amp;gt;&lt;br /&gt;
#ifndef __BASEINHERITANCE_H_YONET__&lt;br /&gt;
#define __BASEINHERITANCE_H_YONET__&lt;br /&gt;
#if _MSC_VER &amp;gt; 1000&lt;br /&gt;
#pragma once&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
class CBaseInheritance {&lt;br /&gt;
protected:&lt;br /&gt;
    int m_iBaseMoney = 0;&lt;br /&gt;
    int m_iBaseMonth = 0;&lt;br /&gt;
    int m_iMoney = 0;&lt;br /&gt;
    int mf_iBaseSumMoney();&lt;br /&gt;
    void mf_vBaseDispValue();&lt;br /&gt;
public:&lt;br /&gt;
    CBaseInheritance();&lt;br /&gt;
    CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth);&lt;br /&gt;
    virtual ~CBaseInheritance();&lt;br /&gt;
    virtual void mfVirtual_vDispValue() = 0;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/Syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　と118行目のように&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    virtual void mfVirtual_vDispValue() = 0;&lt;br /&gt;
&amp;lt;/Syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　とすることで、基底クラスに純粋仮想関数が定義され、抽象クラスになったと言えます。本来の意味としては、派生クラスに全部任せるから、基底クラスを直接利用されないようにmf_vBaseDispValue()はprotectedに移動させておきました。サンプルなので、そこまでする必要もないし、あんまり有意義でもないですが、カッコだけはつけておきました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　それだけではまずくて、プログラム部も以下のように、mfVirtual_vDispValue()のプログラム部分を消す必要があります。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;&amp;quot;&amp;gt;cpp &amp;lt;span&amp;gt;(&amp;lt;/span&amp;gt;基底クラス BaseInheritance.cpp&amp;lt;span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;!-- padding 上 右 下 左--&amp;gt;&lt;br /&gt;
&amp;lt;Syntaxhighlight lang=&amp;quot;cpp&amp;quot; line start=201&amp;gt;&lt;br /&gt;
#include &amp;quot;pch.h&amp;quot;&lt;br /&gt;
#include &amp;quot;BaseInheritance.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CBaseInheritance::CBaseInheritance() {&lt;br /&gt;
    printf(&amp;quot;Constructor:CBaseInheritance()\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseInheritance::CBaseInheritance(int iArgBaseMoney, int iArgBaseMonth)&lt;br /&gt;
                 :m_iBaseMoney(iArgBaseMoney)&lt;br /&gt;
                 ,m_iBaseMonth(iArgBaseMonth)&lt;br /&gt;
                 ,m_iMoney(0) {&lt;br /&gt;
    printf(&amp;quot;Constructor:CBaseInheritance(int,int)\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseInheritance::~CBaseInheritance() {&lt;br /&gt;
    printf(&amp;quot;Destructor:~CBaseInheritance()\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int CBaseInheritance::mf_iBaseSumMoney() {&lt;br /&gt;
    m_iMoney = m_iBaseMoney * m_iBaseMonth;&lt;br /&gt;
    return m_iMoney;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CBaseInheritance::mf_vBaseDispValue() {&lt;br /&gt;
    int iSumMoney = m_iBaseMoney * m_iBaseMonth;&lt;br /&gt;
    printf(&amp;quot;BaseMoney=%d, total=%d\n&amp;quot;, iSumMoney, m_iMoney);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/Syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　このように、まるまるプログラム部分を削りました。このサンプルではプロジェクトからCDeriveArrInheritanceとCDeriveDiscountInheritanceを除外しています。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　で動かすと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #ffffff; background-color: #555555; padding: 0px 5px 0px 5px; display: inline-block;&amp;quot;&amp;gt;実行結果&amp;lt;!-- padding 上 右 下 左--&amp;gt;&lt;br /&gt;
&amp;lt;Syntaxhighlight lang=&amp;quot;text&amp;quot; line start=701&amp;gt;&lt;br /&gt;
Constructor:CBaseInheritance(int,int)&lt;br /&gt;
Constructor:CDriveInheritance(int,int,int)&lt;br /&gt;
BaseMoney=22800, OptionMoney=600 total=23400&lt;br /&gt;
Constructor:CBaseInheritance(int,int)&lt;br /&gt;
Constructor:CDriveInheritance(int,int,int)&lt;br /&gt;
BaseMoney=22800, OptionMoney=600 total=23400&lt;br /&gt;
Destructor:~CBaseInheritance()&lt;br /&gt;
Destructor:~CDriveInheritance()&lt;br /&gt;
Destructor:~CBaseInheritance()&lt;br /&gt;
&amp;lt;/Syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
　と問題なく動作します。&lt;br /&gt;
&lt;br /&gt;
[[C PlusPlus#C++からの技術|C++]]に戻る&lt;/div&gt;</summary>
		<author><name>Yo-net</name></author>
	</entry>
</feed>