programmeur aihser
templateと仮想クラス
最終更新:
匿名ユーザー
-
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を使った方が、きっと高速。