B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

基底クラスの後付け

ちょっと開発中に思いついたことの覚書も兼ねて、
久々にプログラミングカテゴリの記事です。

C++において、ある二つのクラスに、
同じ働きをするメソッドがありますが、
それらは、そのメソッドを実装した、
同じ基底クラスを継承していないとします。

このとき、既存のクラスに変更を加えること無く、
仮想的に同じクラスを継承しているように
見えるようにするにはどうすれば良いか、
というのが今回の話です。

上の説明だけでは抽象的で分かりにくいと
思いますので、具体的にコードを書いてみます。

struct Class1 {
    void Run();
};

struct Class2 {
    void Run();
};

見ての通り、同じ名称のコードが宣言されています。
処理内容もほぼ同じだとします。

これらには、基底クラスが無いので、
例えばこんなことは出来ません。

struct Base {
    virtual void Run()=0;
    virtual ~Base() {}
};

Base *object[2];
object[0]=new Class1();
object[1]=new Class2();
...

これを何とか出来るようにするには
どうすれば良いか、という話です。

前置きが長くなりましたが、解決方法は割と単純です。
次のようなテンプレートクラスを用意します。

template < class T > class Adapter : public Base {
private:
    T object;
public:
    virtual void Run() {
        object.Run();
    }
};

これを使って、先程の例を次のように変更します。

Base *object[2];
object[0]=new Adapter<Class1>();
object[1]=new Adapter<Class2>();
...

これで、既存のクラスに一切変更を加えずに、
基底クラスのようなものを作れました。

ところでこれ、テンプレートが使えない場合、
どうすればいいんでしょうね。
さっぱり見当が付きません。


>>管理者用コメントの方
ありがとうございます。
最近サボるということを覚えてきたので、
あまり無理をしない程度に頑張ります。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。