programmeur aihser
templateと仮想クラス
最終更新:
Bot(ページ名リンク)
-
view
templateと仮想クラス
処理の流れは同じだけど、アルゴリズムを切り替えたいときに
有効なインタフェースの継承。
C++にインタフェースはないので、純粋仮想関数をもったクラスで代用。
でも、純粋仮想関数を持つと、仮想関数テーブルができるので処理速度が遅くなる。
そんなときに有効なのが、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()などのアクセッサを用意する。
あるいは、GetName()などのアクセッサを用意する。
どっちかっていうと、インタフェースの方がすっきりだけど
どっちかっていうと、templateを使った方が、きっと高速。
どっちかっていうと、templateを使った方が、きっと高速。