為何C Rust都不允許靜態函式是虛的?

時間 2021-05-30 00:09:47

1樓:丟貓

可以在一門語言上實現,但是C++ Rust選擇不實現這種動態派發啊,Rust連編譯時的多派發都沒有(方法過載)。但是如果你在Rust裡需要這種派發,你可以用trait來實現。

2樓:Glavo

其實我覺得題主想要的是 Kotlin / Scala 裡 Companion Object 這樣的東西。想模擬的話放個全域性的靜態物件來繼承不就好了……

3樓:原子筆

某些語言,類本身就是物件(而且是個singleton物件),而且資料成員全部是pimpl的,擁有執行時公升級(或者編譯/鏈結後公升級)的能力,那確實可以讓靜態函式虛起來,例如可以讓你在模組A的時候以為在呼叫a方法,但是編寫完模組B後a方法徹底被替換成b方法。

C++類只是個型別名字,只是個名字空間,那當然就沒有辦法提供任何動態能力咯。Rust我不清楚。

4樓:LoveCandy

題主的最大問題出在對oo的理解上。

在oo裡,靜態方法的概念就是指乙個方法屬於乙個類而不是乙個物件。因此語法上靜態方法必須可以通過類名直接訪問,且語意上必須訪問的是這個類的,而不是其子類的。如果用delay binding 去實現靜態方法,那麼執行時呼叫到的就可能是子類的方法,這是違背了靜態方法原本的語意的。

在oo裡,靜態這個概念本身就包含有「編譯期決定」的意義。而virtual的語意卻是執行時決定。如果靜態方法可以為virtual,那不是自相矛盾嗎?

不知道題主是為何想實現virtual static function 的。如果你是想通過物件,物件的指標或引用去訪問這個方法,那就不應該把這個方法設計成靜態方法。如果你想通過類名直接訪問,那正如前文所述,這樣的實現是在給自己留坑:

你呼叫到的可能不是這個類裡的方法。

題主你需要補充一下oo 方面的知識,不能僅僅是學習C++本身。學習任何一門物件導向程式設計語言都必須建立在對物件導向本身的概念有一定理解的基礎之上。

5樓:叛逆者

你的定義不夠精確。否則的話你自己就能發現問題。

這個函式是要執行時查詢具體的入口位址再呼叫的

其實應該是這個函式x是要執行時查詢所在物件具體的入口位址再呼叫的。或者說,虛函式表是從所在物件索引的。

而static不存在所在物件。所以怎麼找它的虛函式表?別忘了在加入static之前,你需要呼叫乙個靜態函式,得這樣:

static_cast

(0

)->Func

();因為Func和物件無關,所以這裡搞個0也無所謂。後來有了靜態函式,你可以寫成:T::

Func

();所以,你這下明白了為什麼虛函式表不能放靜態函式了吧。

你非得要類似功能的話,不用static就行了唄,就把那個函式變成乙個成員。那就隨便virtual了。

6樓:邏輯

虛函式解決的問題是基類型別指標指向繼承類物件時,如何呼叫的問題,因為此時編譯器無法知道這個物件是什麼型別的。

而靜態函式不存在這個問題,只要呼叫,編譯器一定知道它是什麼型別。

7樓:F001

網上有現成答案啊,還要我幫你搜尋 https://stackoverflow.com/questions/1820477/c-static-virtual-members

簡單點總結就是這麼做沒什麼意義。你想達到什麼目的,有什麼應用場景?朝這方面多想想。

C 為何不允許在函式中直接傳遞陣列?

張金戈 很簡單呀,陣列是乙個位址加一段記憶體空間。非陣列string要麼在開頭儲存長度,要麼在結尾用 0結束。陣列本身並沒有這些資訊,所以要額外傳長度 DNFL 關於這個,我說個c語言的例子,對於c 我不太了解。我認為在宣告乙個陣列時,其識別符號有其作用域,那就是乙個函式內。我試過把陣列放到結構體裡...

TP Link為何不允許使用者諮詢硬體配置?難道是欺詐?

烏鴉守夜人 我猜是市場部筆誤。腦洞一下 研發內部肯定是寫4Gb的,上面說商家都是按GB,那是因為不是晶元廠。晶元廠給的都是Gb單位。市場部拿到規格之後一看,哦4G的,於是就寫4G了 WolfBoy tp link 的風格是同一款產品,會隨著時間的推移,逐漸推出不同的硬體版本。因此現在告訴你確切引數,...

聯盟允許哈登聯手杜蘭特 歐文,當年為何不允許科比和保羅聯手?

栗子閒談 當時的紐奧良黃蜂隊是聯盟託管的,聯盟有處理球隊事物的權力,再加上當時報團之風不太盛行,所以聯盟否決了這筆交易。而籃網三巨頭雖然聯盟不太支援,卻也無可奈何,這是性質問題! 當時的黃蜂是聯盟託管 現在的鵜鶘 聯盟相當於老闆,但是不能一直是老闆,為了脫手球隊,手裡得有個當家球星。否則重建時間那麼...