トップ 言語 C・C++ C++言語 オブジェクト指向 C++のis-aまたはhas-a関係

C++のis-aとhas-a関係(オブジェクト指向的な関係)

C++のis-aとhas-a関係(オブジェクト指向的な関係)について説明。is-aは継承に、has-aはカプセル化に関連しているというところまで、簡単なサンプルコードを用いりながら説明しています。

なお、基礎知識や関連情報として以下のような内容がありますので、はじめに紹介しておきます。

要約―C++のis-aまたはhas-a関係

C++のis-aまたはhas-a関係は、以下のとおりです。

  1. is-a関係

    継承関係 …サブクラス is a スーパクラス。

  2. has-a関係

    包含関係 …全体クラス has a 部分クラス。

説明―C++のis-aまたはhas-a関係

このページでは、C++のis-aまたはhas-a関係(オブジェクト指向的な関係)について説明しています。 以下では、簡単なサンプルコードを用いりながらis-a関係has-a関係について説明しています。

C++のオブジェクト指向的な関係

サンプルコードの概要

以下のようなサンプルコードを考えました。 これを使用して説明します。

class Num {
  :
}
class NumAndChar : public Num {
  :
}
class Couter {
private:
	NumAndChar numAndChar;
  :
};
  :

概要説明

1つのアプリケーションを構成するクラス間にはis-ahas-aの2種類の関係が存在します。

1つは、サンプルコードのNumクラスからNumAndCharクラスを派生というクラス間の関係(is-a:継承関係)で、 もう1つは、CouterクラスでのNumAndCharクラスの参照というクラス間の関係(has-a:包含関係)です。

is-a関係

サンプルコードを少し具体化

概要のサンプルコードを少し具体化しました。 これを使用して説明します。

class Num {
private:
	int n;
public:
	void setNum(int value);
	void showNum();
};

class NumAndChar : public Num {
private:
	char c;
public:
	void setChar(char value);
	void showChar();
};

is-a関係とは継承に起因して発生するものです。 サンプルのように、NumクラスからNumAndCharクラスを派生というクラス間の関係(継承関係)です。

上位となる抽象的なクラスをスーパークラスといい、下位の具体的なクラスをサブクラスと言います。 サブクラスは、スーパクラスの機能を原則として受け継ぎスーパクラスの機能も持ち合わせます。 これを継承といい、継承することでスーパクラスの機能をサブクラスで記述しなくて済みます。

例えば、NumAndCharクラスをはじめにつくって、汎用的な性質をまとめてNumクラスを作ることを汎化と言います。 トラック、バス⇒自動車というように複数のクラスに共通する抽象的な性質を別のクラスにするイメージです。

また、作成したNumクラスからNumAndCharクラスを作ることを特化と言います。 自動車⇒トラック、バスというように、抽象的なクラスからもっと具体的なクラスを考えるイメージです。

トラックは自動車である(Track is a car)と言え、この汎化と特化の関係をis-a関係と言います。

has-a関係

さらにサンプルコードを具体化

is-a関係のサンプルコードをさらに具体化しました。 これを使用して説明します。

class C {
class Num {
private:
	int n;
public:
	void setNum(int value);
	void showNum();
};

class NumAndChar : public Num {
private:
	char c;
public:
	void setChar(char value);
	void showChar();
};

class Couter {
private:
	NumAndChar numAndChar;
public:
	void setNumAndChar(NumAndChar value);
	void showNumAndChar();
};

has-a関係とは、クラスという1つの構造体の中に複数のデータやメソッドをまとめて格納します。 サンプルのようにCouterクラスでのNumAndCharクラスの参照というクラス間の関係(包含関係)です。

データとメソッドをまとめることは、データを保護して、モジュールの独立性を高めるのに役立ちます。 これをオブジェクトの情報隠蔽(カプセル化)と言います。

例のようにCouterクラスの属性にNumAndCharクラスがあるように包含関係は、全体と部分の関係を言います。 たとえば、自動車はハンドルやタイヤをもっているように、 あるクラスが別のクラスをデータ(属性)としてもっているという関係を言います。

ハンドルは自動車の一部である(The handle is a part of a motor vehicle)、 自動車はハンドルをもっている(Car has a handle)と言え、この包含関係をhas-a関係と言います。

サンプルコードを動かしてみる

せっかくなのでサンプルコードを動かせるところまで実装して、動かしてみます。

動かせるところまで実装したサンプルコード

#include <iostream>
using namespace std;

class Num {
private:
	int n;
public:
	void setNum(int value);
	void showNum();
};

class NumAndChar : public Num {
private:
	char c;
public:
	void setChar(char value);
	void showChar();
};

class Couter {
private:
	NumAndChar numAndChar;
public:
	void setNumAndChar(NumAndChar value);
	void showNumAndChar();
};

void Num::setNum(int value) {
	n = value;
}

void Num::showNum() {
	cout << "num=" << n << "\n";
}

void NumAndChar::setChar(char value) {
	c = value;
}

void NumAndChar::showChar() {
	cout << "char=" << c << "\n";
}

void Couter::setNumAndChar(NumAndChar value) {
	numAndChar = value;
}

void Couter::showNumAndChar() {
	numAndChar.showNum();
	numAndChar.showChar();
}

int main() {
	NumAndChar numAndChar;
	numAndChar.setNum(1);
	numAndChar.setChar('A');
	Couter couter;
	couter.setNumAndChar(numAndChar);
	couter.showNumAndChar();
}

コンパイル

今回は、Borland C++ Compilerを使用してコンパイルしました。

ソースファイルをSample.cppと保存したフォルダにコマンドプロンプトで移動しbcc32コマンドを実行してコンパイルします。

>cd <保存したフォルダ>
>bcc32 Sample.cpp

実行方法

Sample.exeというファイルができたフォルダにコマンドプロンプトで移動し、Sampleとコマンドラインに入力する以下のように出力されます。

>Sample
num=1
char=A

もっと深く知るための参考

参考書籍

戻る

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Eclipse /gcc /gdb /g++ /JDK /JUnit /ZAP

技術・仕様
Ajax /CORBA /Java EE(旧称J2EE) /JNI

ライブラリ/Framework/CMS
jQuery /Lucene /MyBatis /Spring /Struts /Seasar2 /WordPress

ITインフラ OSとミドルウェア
Linux /Windows /シェル
Apache/Tomcat /MySQL /Redis /Solr /vsftpd

ITインフラ PC 製品
ZOTAC

ITインフラ サーバー
Web公開サーバー構築

ITインフラ ネットワーク
プログラミング /機器 /構築

ITインフラ セキュリティ
公開サーバーのセキュリティ

SI
ホームページの作り方 /小さな会社のISMS

その他
IT用語 /ITスキル体系 /トレンド履歴

スポンサーリンク

関連サイト内検索ツール

zealseedsおよび関連サイト内のページが検索できます。

IPアドレス確認ツール

あなたのグローバルIPアドレスは以下です。

34.204.52.4

HTMLの表示色確認ツール

パスワード生成ツール

文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。

ここに生成されます。

スポンサーリンク