2012/06/22

C++ 多重継承

Javaでは許されない多重継承がC++では出来るので、ちょっと試してみた。

a.h

#ifndef A_H
#define A_H
/** スーパークラス */
class Aclass{
 public:
  Aclass();
  ~Aclass();
  void methodA();
 protected:
  int varA;
};
/** スーパークラス */
class Bclass{
 public:
  Bclass();
  ~Bclass();
  void methodB();
 protected:
  int varB;
};
/** サブクラス 多重継承 */
class Subclass : public Aclass, public Bclass{
 public:
  Subclass();
  ~Subclass();
  void methodSub();
};

#endif
ヘッダファイルにはクラスの宣言を書いた。2つのクラスを継承したサブクラスを作っている。

a.cpp

#include "a.h"
#include <iostream>
/**  Aclass */
Aclass::Aclass(){
  std::cout << "Aclass constructor\n";
  varA = 20;
}
Aclass::~Aclass(){
  std::cout << "Aclass destructor\n";
}
void Aclass::methodA(){
  std::cout << "Aclass::methodA() varA:" << varA << std::endl;
}

/**  Bclass */
Bclass::Bclass(){
  std::cout << "Bclass constructor\n";
  varB = 30;
}
Bclass::~Bclass(){
  std::cout << "Bclass destructor\n";
}
void Bclass::methodB(){
  std::cout << "Bclass::methodB() varB:" << varB << std::endl;
}

/**  Subclass */
Subclass::Subclass(){
  std::cout << "Subclass constructor\n";
}
Subclass::~Subclass(){
  std::cout << "Subclass destructor\n";
}
void Subclass::methodSub(){
  std::cout << "Subclass::methodSub() varA + varB = " 
            << varA+varB << std::endl;
}
拡張子.cppのファイルには実装部分を書いている。やっていることはコンストラクタとデストラクタのチェックと、メンバ変数の扱いのチェック。

a.main

#include "a.h"

/** メイン関数 */
int main(void){
  Subclass *oSubclass;
  oSubclass = new Subclass();
  oSubclass->methodA();
  oSubclass->methodB();
  oSubclass->methodSub();
  delete oSubclass;
  return 0;
}
メイン関数では、継承したサブクラスのみをインスタンス化して、スーパークラスのメソッドとサブクラスのメソッドを実行。サブクラスのメソッドでは、スーパークラスのそれぞれのメンバ変数を扱っている。

以下が実行した結果。まずはスーパークラスのコンストラクタから呼び出されて行く。サブクラスからスーパークラスのメンバ変数を扱うことも可能。デストラクタはサブクラスから行われていくという流れ。多重継承はうまく使わないと、やっかいな見つけにくい問題が頻発しそうだ。個人的に多重継承は使うつもりはない。
Aclass constructor
Bclass constructor
Subclass constructor
Aclass::methodA() varA:20
Bclass::methodB() varB:30
Subclass::methodSub() varA + varB = 50
Subclass destructor
Bclass destructor
Aclass destructor


C++言語 Meadow & MinGW GCC 目次