仮想関数の意義

  • 仮想関数の存在意義が良く分からない。ので使わないことにしよう。

ええと、Java を使える人がそういうこと言いますか。Javaのメソッドコールは全て動的束縛(仮想関数)だと思ったのだけども。まぁ、インスタンスの宣言型と実際の型を常に一致させている人はわかりにくいかもなぁ。
で、なんで仮想関数が必要かって

List list = new ArrayList();

とか、

Component component = new Button();

とかやりたい場面があるから。 あと、

public void foo(OutputStream out) {
    // do something
}

って感じに宣言しておくと、渡すインスタンスによって出力先はファイルやバイト配列やネットワークになると。静的束縛だけだとそう簡単にはいかない。

おまけ

vectorを使ってみる。Generics*1が使えるのでtypesafeっぽくていい感じ。

C++ の template と JavaGenerics って全然違うものなので、同一視するのはどうかと。
JavaGenerics は所詮コンパイル時の型チェックとキャストの自動挿入程度だけど、C++ の template はその名のとおり、template parameter ごとに実装が生成されるという恐ろしい仕組み。template meta programming といってこんなこともできる。

#include <iostream>

template<int n>
struct fact {
    enum {
        value = n * fact<n - 1>::value
    };
};

template<>
struct fact<1> {
    enum {
        value = 1
    };
};

int main()
{
    std::cout << fact<10>::value << std::endl;
    return 0;
}

あと、Java では無理な Duck Typing も template なら可能だったり。