晚上十一点半。光标还在屏幕上死命蹦跶,手里那半杯美式凉得能当冰袋用。白天刚跑通的一段代码,里头有个虚函数,让派生类给硬生生重写了。我盯着那行 override 愣神。琢磨半天,突然就悟了:这操作,不就是咱们平时收拾“旧账”的法子吗?
手边正摊着《C++语言详解与程序设计》。翻到类继承和虚函数那章,作者下笔是真冷。基类把接口拍板定死,派生类看着办。该重写哪个,重写哪个。它压根没逼你推倒重来,只保证一点:同一套调用指令扔下去,结果能不一样。搞技术的谁不爱这设计?底子稳当,手脚还能撒欢。这书我平时真没少搁置,但讲到这儿,那股子“留了后门”的通透劲儿,算是被它写透了。
人打娘胎里出来,自带一套基类。口音、暴脾气、处理亲密关系的糙办法,一遇事儿下意识缩肩膀的毛病,编译时全敲死了。小时候谁没幻想过,长大能来个彻底重构?把旧代码全删了,从头撸。后来摔得鼻青脸肿才懂,扯淡。人哪能生出个没历史的白纸?真要把底裤扒了重写,早崩溃了。谁还有力气应付明天的早八和房贷?
书里原话写得明白:虚函数,就是让程序结构不动如山,行为随时变脸。生活里的“重写”,一个理儿。不掀桌子,半道上拦一下就行。以前一吵架就冷战。甩门走人,等对方服软。现在呢?手指头刚碰到静音键,脑子里的旧程序啪一下弹窗报警。但我硬是憋出一句:“你是不是累着了?”基类的底层逻辑还在。派生类只是把那个特定函数给截胡了。不用重装人生系统,关键路口,贴个 override 就完事儿。
重写?真不轻松。基类的代码跑起来,比脑子还快。情绪还没过闸,话已经砸出去了。事后盯着聊天记录直嘬牙花子。明明知道该怎么回,那一哆嗦,怎么就调了旧版本?大概因为重写得额外掏内存和算力。人脑电量就那点,不可能逢事都重新编译。重载的余地,只能留给真正疼的人、要紧的事。剩下的,随它默认跑。这事儿我常琢磨,未必谁都能改过来。大部分时候,能意识到“哦,原来我也这样了”,就算赢了一半。别对自己太苛刻,缓存没清干净,太正常了。
以前总轴着劲儿,想活得特别点。非要把原生家庭留下的印子全刮干净。有回回老家,听见我爸跟我妈商量晚饭吃啥。那语气,跟我当年一模一样。我整个人一下就静了。不是照葫芦画瓢。是基因里的继承。咱们都在各显神通地继承一套生存法子。无非有人让它一直挂着,有人在岔路口,随手改了一行代码。我有时候甚至觉得,未必非跟这套继承死磕。顺着它跑,反倒少踩几个坑。
在社会上摸爬滚打几年,这感觉更扎手。以前以为成熟是磨平棱角、学会认怂。后来咂摸出滋味:成熟是搞清楚,哪些接口得摆上台面,哪些实现该藏进抽屉。在外头,硬撑着社会要求的基类接口。消息秒回,客套话照说,处理破事情绪稳定。算是对外的交代。对内呢?早就悄悄重写了响应函数。半夜关机发呆,允许。耗人的局甩脸子说不,允许。关系里先低头,也允许。不再死磕着覆盖所有方法。把算力匀给要紧的部分。没顾上改的,顺着基类走,省得累半死。留点默认实现,不是摆烂,是保命。
偶尔也犯嘀咕:万一基类的设计本身就有坑呢?万一继承来的习惯,本来就是给自己找虐?C++里讲究“组合优于继承”。可生活这破系统,没个头文件让你随便替换。只能在既定框架里,一点点敲调试器。改顺了,程序跑得溜,心里松口气。改拧巴了?留着编译警告,接着跑。这套逻辑未必放之四海而皆准。有些人天生基类就带bug,硬改只会死机。能跑通就行。别追求完美。
屏幕上的程序总算跑完了。吐出一串正常的日志。人生哪有什么零报错的编译。咱们揣着基类给的默认实现往前走。在几个关键函数上,慢慢把自己重写。没来得及改的,扔给以后再说。反正调用还在继续。接口没变,总能跑下去。