〜〜 C++講座・JAVA講座・VB講座・ネット収入講座・アフィリエイト講座・メール受信講座・株講座・投資信託講座・お小遣い講座 〜〜

   MENU           == C++基本講座 ==

1. はじめに
2. オブジェクト指向
3. 文法関連
4. クラス
5. コンストラクタ/デストラクタ
6. オーバーライド(仮想関数)
7. オーバーロード
8. new/delete
9. 継承/多重継承
10. 例外処理
11. inline関数,static変数



 得@スキルアップ塾.com > C++基本講座 > 6. オーバーライド

   オーバーライド


■講義一覧
 1. 概要
 2. 仮想関数
 3. 純粋仮想関数
 4. 仮想関数デストラクタの注意



■1.概要
 
 ・オーバーライドとは、親クラスで定義したメソッド名を、子クラスで同一メソッド名で定義することで、
  1つのインタフェースで、複数の実装を可能にすることをオーバーライドと呼ぶ

 ・オーバーライドする対象のメソッドを仮想関数と呼び、親クラスのみ"virtual"を定義します。

■2.仮想関数

 ・仮想関数を定義する場合、"virtual"を対象のメソッドに定義します。

 ・仮想関数は、サブクラスで再定義しなくても問題ありません

【仮想関数クラス例】
// AAA_oyaクラス宣言
class AAA_oya
{

   public:

      //J 仮想関数 funcメソッド
      
virtual void kasou_func();
      
//J デストラクタ
      
virtual ~AAA_oya();

};
// BBB_koクラス宣言(AAA_oyaクラス親)
class BBB_ko : public AAA_oya
{

   public:

      //J funcメソッド
      void kasou_func();

};

//J AAA_oyaクラスのkasou_funcメソッド
void AAA_oya::kasou_func(){

   printf("
AAA_oyaクラスの呼び出し\n");
}
//J BBB_koクラスのkasou_funcメソッド
void BBB_ko::kasou_func(){

   printf("
BBB_koクラスの呼び出し\n");
}



【呼び出し側 例】
// 仮想関数使用
int main(){
   AAA_oya oya, *poya, *pko;
   BBB_ko ko;

   poya = &oya;
   pko = &ko;

@  poya -> kasou_func();
   
A  pko -> kasou_func();
   
   return 0;
}

@では、"AAA_oyaクラスの呼び出し"を表示する。
Aでは、"BBB_koクラスの呼び出し"を表示する。

ちなみに、上記例で"virtual"の定義がなかった場合、以下のように出力内容が変わります。

【仮想関数クラス例2(virtual定義なし)】
// AAA_oyaクラス宣言
class AAA_oya
{

   public:

      //J 仮想関数 funcメソッド
      
void kasou_func();
      
//J デストラクタ
      
~AAA_oya();

};

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
   以降は上記と同じ

【呼び出し側 例】
// 仮想関数使用
int main(){
   AAA_oya oya, *poya, *pko;
   BBB_ko ko;

   poya = &oya;
   pko = &ko;

@  poya -> kasou_func();
   
A  pko -> kasou_func();
   
   return 0;
}

@では、"AAA_oyaクラスの呼び出し"を表示する。
Aでは、"AAA_oyaクラスの呼び出し"を表示する。
※AAA_oyaクラスのポインタで定義したpkoクラスは、子クラスのkasou_funcメソッドではなく、
  自クラスのkasou_funcメソッドを呼び出されます。

一覧へ

■3.純粋仮想関数

 ・下位クラスで定義されることを前提とした場合は、純粋仮想関数を用います。

 ・個々のオブジェクトごとに仕様が異なるのであれば、純粋仮想関数を使用すべきです。

【純粋仮想関数と仮想関数の違い】
1 virutal メンバ関数名(引数) = 0;で定義する
2 純粋仮想関数を定義は必要なし
3 純粋仮想関数を持つクラスはオブジェクトの生成ができない
4 純粋仮想関数を持つクラスを継承したクラスは
純粋仮想関数を必ずオーバーライドする必要がある。

【純粋仮想関数クラス例】
// AAA_oyaクラス宣言
class AAA_oya
{

   public:

      //J 仮想関数 funcメソッド
      
virtual void kasou_func() = 0;
      
//J デストラクタ
      
virtual ~AAA_oya();

};
// BBB_koクラス宣言(AAA_oyaクラス親)
class BBB_ko : public AAA_oya
{

   public:

      //J funcメソッド
      void kasou_func();

};

//J AAA_oyaクラスのkasou_funcメソッド
//J 純粋仮想関数の場合、メソッド定義はしてはいけない!!
//void AAA_oya::kasou_func(){
//
//   printf("AAA_oyaクラスの呼び出し\n");
//}

//J BBB_koクラスのkasou_funcメソッド

void BBB_ko::kasou_func(){

   printf("
BBB_koクラスの呼び出し\n");
}



【呼び出し側 例】
// 仮想関数使用
int main(){
@  //AAA_oya oya;
   AAA_oya *pko;
   BBB_ko ko;

   pko = &ko;

A  ko. kasou_func();
   
B  pko -> kasou_func();
   
   return 0;
}

@では、オブジェクトを生成するとエラーになる。
Aでは、"BBB_koクラスの呼び出し"を表示する。
Bでは、"BBB_koクラスの呼び出し"を表示する。


一覧へ


■4.仮想関数デストラクタの注意

 ・派生する可能性があるクラスのデストラクタについては、仮想関数しておくことをお勧めします
  ※デストラクタが仮想関数でない場合、派生クラスのデストラクタが呼ばれない場合がありますので、
    十分に注意して下さい。 メモリ解放処理などはある場合は、リークが発生します。

【補足】
コンストラクタ: 親コンストラクタ → 子コンストラクタ の順番で呼び出される。
デストラクタ: 子デストラクタ → 親デストラクタ の順番で呼び出される。


【仮想関数デストラクタの注意】
class A{
public:

  A(){
   printf(
"クラスAのコンストラクタ\n");

  }
  ~A(){
   printf(
"クラスAのデストラクタ\n");
  }

};

class B :public A{
public:
  B(){
   printf(
"クラスBのコンストラクタ\n");

  }

  ~B(){
   
// 呼ばれない
   printf(
"クラスBのデストラクタ\n");

  }

};


void main(){

  A *oya;

  oya = new B();
  delete oya;

}
class A{
public:

 A(){
  printf(
"クラスAのコンストラクタ\n");

 }
 
virtual ~A(){
  printf(
"クラスAのデストラクタ\n");
 }

};

class B :public A{
public:
 B(){
  printf(
"クラスBのコンストラクタ\n");

 }

 ~B(){

  printf(
"クラスBのデストラクタ\n");

 }

};


void main(){

 A *oya;

 oya = new B();
 delete oya;


}
【出力結果】
クラスAのコンストラクタ
クラスBのコンストラクタ
クラスAのデストラクタ


【出力結果】
クラスAのコンストラクタ
クラスBのコンストラクタ
クラスBのデストラクタ
クラスAのデストラクタ





一覧へ


 
    
A8ネット
 ・人気度:★★★★★
 ・言わずと知れた人気ASP

 
楽天市場
 ・人気度:★★★★★
 ・誰でも安心、楽天市場で

タワーレコード
 ・人気度:★★★★☆
 ・CD/DVDならタワレコで

 
■ネット証券関連おすすめ
イー・トレード証券
 ・人気度:★★★★★
 ・初心者はこちらから

マネックス証券
 ・人気度:★★★★★
 ・中級者ならこちらから






Copyright(C)2007 得@スキルアップ塾.comAll right reserved.