1840年1月24日（天保10年12月20日）、近江国野洲郡中山道守山宿の加宿吉身郷（現・滋賀県守山市吉身）に住いする岡田弥兵衛（諱は久忠）の長男として誕生。岡田家は士格に列し、宮津藩領分庄屋総代を務め、別に種油製造「大黒屋」を営んでいた。1845年（弘化2年）、森唯楽軒の私塾に入塾。1852年（嘉永5年）、黒船の浦賀への来航を見るため家出同然に守山を出奔。浦賀より江戸に遊学していたが、翌々年父の遣いにより連れ戻される。1857年（安政4年）11月、近江国栗太郡辻村の木村重左衛門の五女「たみ」と結婚し、4年後家督を継ぐ。1867年（慶應3年）、万石総代役に進み、翌年守山宿総代役兼守山宿伝馬所総元締めとなる。
『キミとボクをつなぐもの』（きみとぼくをつなぐもの）は荒井チェリーの漫画作品。芳文社発行の『まんがタイムきららフォワード』Vol.1（創刊号）から連載が開始。Vol.1からVol.4までは毎号、vol.6より隔月連載となり、2009年1月号まで連載された。
専門は私鉄、特に車両史であり、自らローカル私鉄に出かけて膨大な写真や資料を採取。私鉄や私鉄電車に関する情報量では日本一とも言われた。国鉄・JRは専門外だが「買収国電」「私鉄の103系」といった、国鉄と私鉄が絡む記事には高い頻度で登場している。吉川の文章は単なる情報の羅列や見聞録だけでなく、吉村光夫や野村董同様、ウィットとユーモアにちなむ文才で知られていた。その吉村とは生前、同じ神奈川地区在住で私鉄ファンと言うこともあり、最も親交の深い一人であった。またヤマケイ私鉄ハンドブック「京浜急行」では吉川と吉村が1枚の写真内に映っているものが掲載されている。曽根悟の様な公共交通政策、および種村直樹の様な汽車旅にも造詣が深い記述を時折見せたが、この二分野については専門の記事を残した事はない。鉄道友の会には創立時から関わり、副会長、理事、東京支部長、私鉄部会長などを歴任。他に京急電車ファンクラブ、トラストトレイン、産業考古学会などにも名を連ねていた。
東京本郷の尚工舎(現シチズン時計)の工場を運営する家に生まれる、祖父は元工場長の吉川政吉、父は元NHK芸能局長の吉川義雄。幼少時東京都世田谷区に住み、近所の井の頭線、小田急線、東急線などを見て育ち、東急は小学校の通学にも使った（都市名・社名・路線名は現在のもので表現）。1955年3月日本大学工学部電気工学科卒業。後に神奈川県鎌倉市に家を構え、本業は池貝鉄工勤務、累進して溝の口工場長を最後に退職。その後、大和電業に勤務し、関東学院大学、神奈川大学（いずれも工学部）で非常勤講師も務めた。1997年、65歳で大和電業を退職した。晩年の数年間は入退院を繰り返し、原稿依頼も書籍など大型なものから、エッセイ等短いものへの限定を余儀なくされていった。最後の数か月は寝たきりとなり、地元の車両・江ノ島電鉄500形電車 (2代)にもなかなか乗れないことを残念がっていたと言う。
一見したところでは、ダブルディスパッチは関数のオーバーロードの自然な結果である。関数のオーバーロードは呼び出されるクラスだけではなく、引数の型にも応じて呼び出しが行われるようにすることができるが、オーバーロードされた関数の呼び出しはほぼ一つの仮想関数テーブルを通じて行われるため、動的なディスパッチは呼び出すオブジェクトの種類によってのみ決まる。下記の例において、あるゲームで衝突の判定を行う場合を考える。class SpaceShip {};class GiantSpaceShip : public SpaceShip {};class Asteroid {public:  virtual void CollideWith(SpaceShip&) {    cout << "Asteroid hit a SpaceShip" << endl;  }  virtual void CollideWith(GiantSpaceShip&) {    cout << "Asteroid hit a GiantSpaceShip" << endl;  }};class ExplodingAsteroid : public Asteroid {public:  virtual void CollideWith(SpaceShip&) {    cout << "ExplodingAsteroid hit a SpaceShip" << endl;  }  virtual void CollideWith(GiantSpaceShip&) {    cout << "ExplodingAsteroid hit a GiantSpaceShip" << endl;  }};ここで、Asteroid theAsteroid;SpaceShip theSpaceShip;GiantSpaceShip theGiantSpaceShip;があるとすると、関数のオーバーロードのためにtheAsteroid.CollideWith(theSpaceShip); theAsteroid.CollideWith(theGiantSpaceShip);上記のコードは、動的なディスパッチを使用せず、 Asteroid hit a SpaceShip および Asteroid hit a GiantSpaceShip とそれぞれ表示する。さらに、ExplodingAsteroid theExplodingAsteroid;theExplodingAsteroid.CollideWith(theSpaceShip); theExplodingAsteroid.CollideWith(theGiantSpaceShip);上記のコードはExplodingAsteroid hit a SpaceShip およびExplodingAsteroid hit a GiantSpaceShip と、やはり動的なディスパッチを使用せずに表示する。Asteroidに対する参照を使って動的なディパッチを用いると、Asteroid& theAsteroidReference = theExplodingAsteroid;theAsteroidReference.CollideWith(theSpaceShip); theAsteroidReference.CollideWith(theGiantSpaceShip);ExplodingAsteroid hit a SpaceShip および ExplodingAsteroid hit a GiantSpaceShipと期待通りに表示する。しかし、SpaceShip& theSpaceShipReference = theGiantSpaceShip;theAsteroid.CollideWith(theSpaceShipReference); theAsteroidReference.CollideWith(theSpaceShipReference);は、Asteroid hit a SpaceShip および ExplodingAsteroid hit a SpaceShipと表示するが、これはいずれも正しくない。問題は、仮想関数が C++ によって動的にディスパッチが行われるのに対して、関数のオーバーロードは静的に行われるためである。