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

Similar documents
Microsoft PowerPoint ppt

Prog2_12th

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

Javaの作成の前に

PowerPoint プレゼンテーション

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Prog2_9th

ソフトゼミC 第二回 C++の基礎

スライド 1

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

JavaプログラミングⅠ

プログラミング実習I

PowerPoint プレゼンテーション

Microsoft Word - no11.docx

プログラミング基礎

Java知識テスト問題

演算増幅器

design_pattern.key

Microsoft PowerPoint - ep_cpp04.ppt

JavaプログラミングⅠ

Slide 1

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

C言語7

JavaプログラミングⅠ

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft Word - no12.doc

JavaプログラミングⅠ

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

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

Microsoft PowerPoint - prog04.ppt

科学的モデリング 2 回 継承 2 無断転載 & 無断配布を禁じます 第 2 回 : 科学的モデリング 継承 2 継承される特性( プロパティ ) 第 2 回の話題 継承は何を継承するのか? 今回のコラムの話題は 継承される特性 ( プロパティ ) についてです そもそもサブクラスはスーパークラスか

プログラミング入門1

第3回 配列とリスト

Microsoft PowerPoint - kougi9.ppt

main

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

Prog1_10th

CプログラミングI

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

GEC-Java

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

file:///D|/C言語の擬似クラス.txt

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

Microsoft Word - no202.docx

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

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

Microsoft PowerPoint - kougi2.ppt

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

C C UNIX C ( ) 4 1 HTML 1

Microsoft PowerPoint - 13.ppt [互換モード]

JAVA入門

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

gengo1-11

Microsoft PowerPoint pptx

P05.ppt

Embarcadero Developer Camp

P06.ppt

Microsoft PowerPoint - 11.pptx

Microsoft Word - Training10_プリプロセッサ.docx

JavaプログラミングⅠ

超初心者用

kiso2-03.key

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

Microsoft PowerPoint - 12.ppt [互換モード]

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - lec10.ppt

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

二分木の実装

講習No.12

PowerPoint プレゼンテーション

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

PowerPoint Presentation

プログラミング基礎

プログラミング基礎

PowerPoint プレゼンテーション

基本情報STEP UP演習Java対策

関数の中で宣言された変数の有効範囲はその関数の中だけです さっきの rectangle _s で宣言されている変数 s は他の関数では使用できません ( 別の関数で同じ名前の変数を宣言することはできますが 全く別の変数として扱われます このように ある関数の中で宣言されている変数のことをその関数の

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

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

kiso2-09.key

Microsoft Word - no13.docx

第2回講義

数値計算

Microsoft PowerPoint - lec06 [互換モード]

memo

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

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

Microsoft PowerPoint - OOP.pptx

Make the Future Java FY13 PPT Template

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

基礎プログラミング2015

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