きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

インナークラスによる複数のインターフェース実装

複数のインターフェイスがあって、それを実装するクラスCがあるとします。複数のインターフェイスを型によって使い分けたいとき便利な方法があります。

以下のように実装をインナークラスに書き、変換演算子によって変換するというものです。

#include <iostream>

using namespace std;

struct BaseA_IF {
	virtual void func() = 0;
};

struct BaseB_IF {
	virtual void func() = 0;
};

struct C {
	struct BaseA : public BaseA_IF {
		void func() { cout << "BaseA::func()" << endl; }
	} base_a;

	struct BaseB : public BaseB_IF {
		void func() { cout << "BaseB::func()" << endl; }
	} base_b;

	operator BaseA&() {
		return base_a;
	}

	operator BaseB&() {
		return base_b;
	}
};

int main() {
	C c;

	BaseA_IF& ba = c;
	ba.func(); // BaseA::func()

	BaseB_IF& bb = c;
	bb.func(); // BaseB::func()

	cin.get();
}

なお、C++の言語の支援によって成り立つポリモーフィズムではないのでポインタにするのは大変危険です。