Microsoft Word - C言語研修 C++編 3.doc

Similar documents
メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

PowerPoint プレゼンテーション

JavaプログラミングⅠ

PowerPoint プレゼンテーション

JavaプログラミングⅠ

プログラミング実習I

Java知識テスト問題

design_pattern.key

JavaプログラミングⅠ

プログラミング基礎I(再)

JavaプログラミングⅠ

JavaプログラミングⅠ

Microsoft Word - no15.docx

PowerPoint プレゼンテーション

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

main

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Javaプログラマー早期育成ドリル ~コードリーディング編~ 解答

Microsoft PowerPoint - kougi2.ppt

Microsoft Word - Cプログラミング演習(7)

JAVA入門

gengo1-11

P05.ppt

P06.ppt

JavaプログラミングⅠ

kiso2-03.key

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - lec10.ppt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

PowerPoint Presentation

プログラミング基礎

PowerPoint プレゼンテーション

基本情報STEP UP演習Java対策

C言語によるアルゴリズムとデータ構造

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

memo

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

第1回 プログラミング演習3 センサーアプリケーション

Microsoft Word - Cプログラミング演習(10)

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

第 1 章 : はじめに RogueWave Visualization for C++ の Views5.7 に付属している Views Studio を使い 簡単な GUI アプリケーションの開発手順を紹介します この文書では Windows 8 x64 上で Visual Studio2010

Transcription:

2006/05/10

オブジェクト指向... 3 1 クラスの継承... 3 2 継承の書式... 3 3 protected... 5 4 メンバ関数のオーバーライド... 6 5 クラスの型キャスト... 7 6 仮想関数... 8 2

オブジェクト指向 1 クラスの継承 クラスには 継承 という機能があります 継承とは 既にあるクラスを元に 新しいクラスを作る 機能です 継承元のクラスを 親クラス 又は スーパークラス あるいは 基底クラス 継承先のクラスを 子クラス 又は サブクラス といいます 子クラスは 親クラスのメンバ変数 メンバ関数の全てを受け継ぎます 2 継承の書式 クラスの継承は 次のように行います // 親クラス class CParentClass CParentClass(); ~CParentClass(); void SetInt(int val); int GetInt()const; private: int m_nint; ; // 子クラス class CChildClass : public CParentClass CChildClass(); ~CChildClass(); ; CParentClass を public で継承 という意味 メンバ変数もメンバ関数も定義していないが CParentClass を継承しているため SetInt も GetInt も使用可能 もちろん m_nint も持っている 3

例 : #include <stdio.h> // クラスCParentClassの宣言 class CParentClass void GetName() private: int ; m_nvala; // クラス CParentClass の実装 int CParentClass::GetInt()const return m_nvala; void CParentClass::SetInt(int val) m_nvala = val; // クラス CChildClass の宣言 ( クラス CParentClass を継承 ) class CChildClass : public CParentClass ; // main( クラス CChildClass を使用 ) int main() CChildClass cchild; cchild.setint(1); printf("%d", cchild.getint()); return 0; 1 4

3 protected 上記クラスで CChildClass に 継承したメンバ変数の値を表示する DispInt メンバ関数を追加したとします // クラス CChildClass の宣言 ( クラス CParentClass を継承 ) class CChildClass : public CParentClass void DispInt()const; ; // クラス CChildClass の実装 void CChildClass::DispInt()const printf("%d", m_nvala); しかし これはコンパイルエラーになります m_nvala が private 節で宣言されているためです private 節で宣言されている変数については 同クラス以外参照することが出来ないためです 逆にもし m_nvala を public 節においてしまうと どこからでも参照できるようになってしまうので これは好ましくありません この状態を打破してくれるのが protected 節です protected 節に書かれた変数 関数は 外からは触れられませんが 継承先のクラスからは参照可能なメンバとなります したがって CParentClass の宣言を次のように修正すれば 子クラスからも m_nvala を参照できるようになります // クラスCParentClassの宣言 class CParentClass int GetInt()const; void SetInt(int val); protected: int ; m_nvala; 変更 これで子クラスからも参照可能 5

4 メンバ関数のオーバーライド 子クラスは 親クラスの持っているメンバ関数を上書き定義することが出来ます これをオーバーライドといいます // クラスCChildClassの宣言 ( クラスCParentClassを継承 ) class CChildClass : public CParentClass int GetInt()const; // GetInt() を上書き ( オーバーライド ) void DispInt()const; ; // クラス CChildClass の実装 void CChildClass::DispInt()const printf("%d", m_nvala); int CChildClass::GetInt()const return -9999; // main( クラス CChildClass を使用 ) int main() CChildClass cchild; cchild.setint(1); printf("%d\n", cchild.getint()); cchild.dispint(); return 0; -9999 1 上書きされたメンバ関数が呼び出された m_nvala の値はセットされた 1 のまま ちなみに 親クラスの GetInt() が呼びたいときには 次のように明示的に書きます printf("%d\n", cchild.cparentclass::getint()); 1 1 6

5 クラスの型キャスト 親クラスのポインタには 子クラスのインスタンスのアドレスを格納することが出来ます このとき 親クラスのポインタに対して GetInt( オーバーライドされた関数 ) を呼ぶと 親クラスの GetInt が呼ばれます // main( クラス CChildClass を使用 ) int main() CChildClass cchild; cchild.setint(1); CParentClass* pparent = &cchild; // 親クラスのポインタにキャスト printf("%d\n", cchild.getint()); printf("%d\n", pparent->getint()); return 0; -9999 1 7

6 仮想関数 5にて 親クラスのポインタにキャストされた場合 オーバーライド前のメンバ関数が呼ばれてしまうのが嫌な場合 親クラスのメンバ関数を仮想関数にします 仮想関数にするには 関数に virtual という修飾子をつけます この修飾子はクラス宣言部にのみ必要です // クラスCParentClassの宣言 class CParentClass virtual int GetInt()const; void SetInt(int val); virtual をつけると この関数は仮想関数になる protected: int ; m_nvala; // クラス CParentClass の実装 int CParentClass::GetInt()const return m_nvala; 実装には virtual はつけない -9999-9999 8

ココまでのことを踏まえると 次のようなコードが書けることが分かるかと存じます class CChild virtual const char* GetPosition()const return " 子供 "; void SetName(const char* sname) strcpy(m_sname, sname); const char* GetName()const return m_sname; protected: char m_sname[bufsiz]; ; class CTyounan : public CChild const char* GetPosition() const return " 長男 "; ; class CJinan : public CChild const char* GetPosition() const return " 次男 "; ; class CSannan : public CChild const char* GetPosition() const return " 三男 "; ; 9

#define KYOUDAI 3 void main() CTyounan taro; CJinan jiro; CSannan sabu; taro.setname(" 太郎 "); jiro.setname(" 次郎 "); sabu.setname(" 三郎 "); CChild* pkyoudai[kyoudai]; pkyoudai[0] = &taro; pkyoudai[1] = &jiro; pkyoudai[2] = &sabu; printf(" 誰の身分が知りたい?\n"); for(int i = 0; i < KYOUDAI; i++) printf("%d:%s\n", i, pkyoudai[i]->getname()); printf(" その他 : 表示しない \n"); int nsel(0); scanf("%d", &nsel); if(kyoudai < nsel) printf(" ヤツの身分は %s です ", pkyoudai[nsel]->getposition()); 誰の身分が知りたい? 0: 太郎 1: 次郎 2: 三郎その他 : 表示しない 2 ヤツの身分は三男です 10