W.I.S. Laboratory
menu-bar

C


C言語で動的ポリモーフィズムをしてみる

Cで動的ポリモーフィズムをやってみた。
Cはオブジェクト指向型言語ではないのでクラスはないし継承もできないし当然ポリモーフィズムはできない・・と思われがちだが、Cには「自由度の高さ」という武器がある。
特に「void型ポインタ」と「関数ポインタ」は、無限の可能性を秘めている。(と思う)
Objective-CがCのまま(C++のように他の言語にならずに)オブジェクト指向型言語へシフトできたのも、この2つがあったからこそだ。

Cの構造体にはデータしか格納できないので、当然C++やJavaのクラスのように関数やメソッドを格納することはできない。
しかしCの関数ポインタはデータなので、構造体に格納することが可能だ。
要するに、構造体にジャンプテーブルを格納しておいて、そこを経由して関数を呼べばCでもメソッドチェーン(foo.barfunc() とか foo->barfunc() みたいなの)ができるというわけだ。

じゃあ継承はどうするのかというと、親構造体を丸っと子構造体のメンバとして入れ込めば良い。
こうすれば子構造体型のインスタンスポインタは親構造体型へアップキャストできる。
関数(へのポインタ)が格納されたインスタンスをアップキャストできるということは、その関数はオーバーライドができるということだ。
予め継承したメンバ(関数ポインタ)を、親とは別の関数へ紐づけておけば(要するに別の関数ポインタを代入すれば)、それがオーバーライドになる。

継承とオーバーライドができるということは、動的ポリモーフィズムが可能になるというわけだ。
もちろんそれ用に設計された言語ではないので、C++やJavaなどに比べるとコードが長くなる上に読みにくくなるが、逆を言えばオブジェクト指向型言語というのは、こういうことをシンプルに書きやすくした言語だと言える。
GoやRustですらできない動的ポリモーフィズムがCならできるというのは面白いなと思う。


[ 戻る ]
saluteweb