1925年、北京。娼婦の母親に連れられ、孤児や貧民の子供たちが集まる京劇の養成所に入った9歳の少年・小豆子。新入りの小豆子は他の子供たちからいじめられたが、彼を弟のようにかばったのは小石頭だけだった。2人は成長し、女性的な小豆子は女役に、男性的な小石頭は男役に決められる。小豆子は「女になれ」と老師爺(黄斐)に躾られ、数え切れないほど殴られた。彼らは演技に磨きをかけ、小石頭は段小(張豊毅)、小豆子は程蝶衣(張國栄)と芸名を改め、京劇『覇王別姫』のコンビとして人気を博す。段小はある日、しつこい客に絡まれていた娼婦の菊仙(鞏俐)を助けたことをきっかけに、彼女と結婚する。少年時代より小にほのかな恋情を覚えていた蝶衣は2度と共演はしないと捨てゼリフを吐いて去る。その日北京は日本軍に占領された。ある日小は楽屋で騒動を起こし連行されてしまう。菊仙は日本側に取り入ってもらえるのだったら小と別れてもいいと蝶衣に告げるが、彼の協力で釈放された小は日本のイヌと彼を罵り菊仙を連れて去る。深く傷ついた蝶衣はアヘンに溺れる。そんなことがありながらも2人は和解へと進む。その後老師爺はこの世を去り、日本軍の敗退で抗日戦争は終わる。49年、共産党政権樹立。蝶衣と小は再び舞台に立つが、京劇は新しい革命思想に沿うよう変革を求められていた。変革に懐疑的な蝶衣は小四に批判され、そればかりか彼に『覇王別姫』の虞姫役を奪われてしまう。ショックを受けた蝶衣は芝居をやめてしまう。66年、文化大革命。共産党の厳しい政治的圧力を受け、小は蝶衣の過去の罪を摘発せよと強制される。小はそれに屈するが、同時に彼も激しく批判され、娼婦だった菊仙など愛していないと言ってしまう。彼の言葉を聞いた菊仙は自殺してしまう。77年、蝶衣と小は無人の体育館におもむき、11年ぶりに2人だけで最後の『覇王別姫』を演じる。舞い終わった時、蝶衣は自らの命を断った。