Top > C++言語 > 関数のオーバーロード


オブジェクト指向の三本柱

  • オブジェクト指向とは、継承とカプセル化と多態性を使うことだという一説がある
  • 継承、カプセル化、多態性は、オブジェクト指向プログラミングの三本柱と言われている
継承(inheritance)
他のクラスのメンバを引き継ぎ、新しいクラスを定義すること
カプセル化(encapsulation)
クラスのメンバを部分的に隠すこと
多態性(polymorphism)
同じメッセージに対して、複数の異なる応答をすること
(多様性や多義性と呼ぶ場合もある)


オーバーロードによる多態性

  • 1つのクラスの中に、同じ名前のメンバ関数を複数定義することである
  • オーバーロード (over load)とは、「多重定義」という日本語に訳せる
サンプル
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
-
|
|
|
!
 
 
 
-
|
!
 
 
 
-
|
!
 
 
 
-
|
|
|
|
|
|
!
class MyClass
{
public:
  int nibai (int a);
  double nibai (double a);
};
 
int
MyClass::nibai (int a)
{
  return a * 2;
}
 
double
MyClass::nibai (double a)
{
  return a * 2;
}
 
void
main (void)
{
  MyClass obj;
  int a;
  double b;
 
  a = obj.nibai (1234);
  b = obj.nibai (3.14);
}
ポイント
  • C言語では、コンパイルエラーとなる
  • C++ コンパイラは、関数を名前と引数で識別する (戻り値を関数の識別に使用しない)
  • MyClass を使う側では、
    「引数の値を2倍するには、nibai() というメンバ関数を呼び出せば良い」ということになる
  • オーバーロードによって、同じメッセージ(nibai) に対して、
    複数の異なる応答をする多態性が実現できる


オーバーロード第2の活用法

  • 前節で、引数の型が異なる活用法を紹介した
  • もう1つの活用法は、引数の数が異なる同じ名前のメンバ関数を定義することです
サンプル
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 
 
-
|
|
|
|
!
 
 
 
-
|
!
 
 
 
-
|
!
 
 
 
-
|
|
|
!
 
 
 
-
|
|
|
|
|
!
#include <stdio.h>
 
class MyClass
{
public:
  void showMessage (void);
  void showMessage (char *s);
  void showMessage (char *s, int n);
};
 
void
MyClass::showMessage (void)
{
  printf ("Hello world.\n");
}
 
void
MyClass::showMessage (char *s)
{
  printf ("%s\n", s);
}
 
void
MyClass::showMessage (char *s, int n)
{
  int i;
  for (i = 0; i < n; i++)
    printf ("%s\n", s);
}
 
void
main (void)
{
  MyClass obj;
 
  obj.showMessage ();
  obj.showMessage ("Hard development.");
  obj.showMessage ("HELLO WORLD", 3);
}
ポイント
  • 異なる数の引数を持つメンバ関数をオーバーロードする場合は、
    1つのメンバ関数が他のメンバ関数を呼び出すようにすると効率的
上記サンプルの改善
すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 
-
|
!
 
 
 
-
|
!
 
 
 
-
|
|
|
!
void
MyClass::showMessage (void)
{
  showMessage ("Hello world.", 1);
}
 
void
MyClass::showMessage (char *s)
{
  showMessage (s, 1);
}
 
void
MyClass::showMessage (char *s, int n)
{
  int i;
  for (i = 0; i < n; i++)
    printf ("%s\n", s);
}


参考


リロード   凍結解除 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Mon, 03 Jun 2019 14:37:49 UTC (686d)