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 目次