programmeur aihser

templateと仮想クラス

最終更新:

匿名ユーザー

- view
管理者のみ編集可

templateと仮想クラス

処理の流れは同じだけど、アルゴリズムを切り替えたいときに
有効なインタフェースの継承。
C++にインタフェースはないので、純粋仮想関数をもったクラスで代用。
でも、純粋仮想関数を持つと、仮想関数テーブルができるので処理速度が遅くなる。
そんなときに有効なのが、template。
というあれ。

でも、あまり使えなさそう。

インタフェース的なクラスの継承による動的束縛

#include <iostream>
using namespace std;

class VClass
{
protected:
	const char * name;

public:
	VClass(const char * name) : name(name) {}
	virtual ~VClass() {}

public:
	void whoami() {
		cout << name << endl;
	}
};

class RClass1 : public VClass
{
public:
	RClass1(const char * name) : VClass(name) {}
	~RClass1() {}
};

class RClass2 : public VClass
{
public:
	RClass2(const char * name) : VClass(name) {}
	~RClass2() {}
};

int main()
{
	VClass * v;

	v = new RClass1("hoge"); v->whoami(); delete v;
	v = new RClass2("piyo"); v->whoami(); delete v;

	return 0;
}

templateを使った、動的束縛風の処理

#include <iostream>
using namespace std;

template <class HasName_Class>
void whoami(HasName_Class c)
{
	cout << c.name << endl;
};


class RClass1
{
public:
	const char * name;

public:
	RClass1(const char * name) : name(name) {}
	~RClass1() {}
};

class RClass2
{
public:
	const char * name;

public:
	RClass2(const char * name) : name(name) {}
	~RClass2() {}
};

int main()
{
	RClass1 c1("hoge"); whoami(c1);
	RClass2 c2("piyo"); whoami(c2);

	return 0;
}
template関数からnameを参照するには、nameをpublicにするかfriend関数に指定する。
あるいは、GetName()などのアクセッサを用意する。

どっちかっていうと、インタフェースの方がすっきりだけど
どっちかっていうと、templateを使った方が、きっと高速。
記事メニュー
目安箱バナー