看板 C_and_CPP 關於我們 聯絡資訊
想請問一個class 繼承問題 class Base { public: virtual void foo() = 0; Base{}; ~Base{}; } clase Derived : public Base { 內容略 } 請問有辦法可以讓Derived class去實作foo()的內容, 同時又能Derived::foo()這樣使用嗎? c++不能virtual+static同時使用, 有別的方式可以達到同樣的 目的嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.72.64.165 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1699577031.A.0CF.html
LPH66: 可以說說想要這樣設計的理由嗎? 11/10 08:45
LPH66: 你為什麼需要一個 Base::foo() 的「介面」在那裡? 11/10 08:46
kakar0to: Derived會有很多個,例如Derived_A,Derived_B等等 11/10 08:54
kakar0to: 主要目的是希望Derived不要忘了去時做出foo的內容. 11/10 08:54
kakar0to: 然後又想要可以沒有instance的時候使用foo()這個api 11/10 08:54
kakar0to: 如果Derived不會忘了去做出foo的內容的話, 應該就 11/10 08:56
kakar0to: 沒有這個問題, 想問一下大家的看法 11/10 08:57
LPH66: 所以你的各 Derived 只是各種可以 foo 的標記? 11/10 09:01
LPH66: 因為你想靜態使用, 這表示各 Derived 不會有成員 11/10 09:01
LPH66: 那各 Derived 之間的差別就僅僅是 foo 實作不同而已 11/10 09:01
LPH66: 回到「不會忘了去做出foo的內容」這句話, 為什麼你會想要 11/10 09:06
LPH66: Derived 「不會忘了實作一個靜態方法」? 有誰會用嗎? 11/10 09:06
kakar0to: Derived會有其他的內容。 不是只有一個foo functio 11/10 09:08
kakar0to: n 11/10 09:08
kakar0to: 抱歉 我晚點把使用情境描述的更清楚一點。這樣太模 11/10 09:10
kakar0to: 糊,應該很難給意見。 11/10 09:10
kakar0to: 等等會重新編輯文章。 11/10 09:11
sanctitysky: 不能使用嗎? 還是你需要的是static? 沒要動態轉型 11/10 09:18
sanctitysky: 可以用concept 11/10 09:18
wulouise: USECASE列出來吧.. 11/10 10:00
LPH66: 其實 concept (或 pre-C++20 用 SFINAE) 應該八成是他要的 11/10 10:54
LPH66: 這樣甚至不需要一個 "Base" 在那裡 11/10 10:55
LPH66: 但我好像很少看到這類型的限定會用在 static 成員函數上 11/10 10:55
Lipraxde: Derived 有實作 foo 的話,為什麼要回頭用 Base::foo? 11/10 11:10
Lipraxde: 哦~看懂了XD 11/10 11:13
s4300026: 如果你可以呼叫static來解決問題,那就不用virtual啊。 11/10 11:39
s4300026: 本來就該分兩個方法,有實體就用virtual,沒實體呼叫st 11/10 11:39
s4300026: atic。不然就是必定有實體,static的方法寫在base。 11/10 11:39
wulouise: 每個derived都要不同實作還是大家都要一樣的? 11/10 11:42
wulouise: 我覺得你要的是free function在不同namespace 11/10 11:43
CoNsTaR: 寫 TMP 會有這種需要多個 class 實作同一個靜態函數的要 11/10 12:29
CoNsTaR: 求,但如果原 Po 是在寫 TMP 大概也不會來問這問題 11/10 12:29
johnjohnlin: 用derive* call foo不是你要的嗎 11/10 12:47
Lhmstu: 在base class加上function pointer,然後derived class都 11/10 13:24
Lhmstu: 需要實作 foo去修改這個function pointer指向的真正的實 11/10 13:24
Lhmstu: 作函數 11/10 13:24
lycantrope: impl Foo for Derived (Rust來亂x 11/10 16:15
clh960524: 假如原 PO 是問 derived class 腰實作 base class 的 11/10 17:17
clh960524: 一個 function,且為了最好效能,該 function 一定要 11/10 17:17
clh960524: template,可以參考 CRTP 11/10 17:17
clh960524: 要實際範例的話,可以參考這個 PR:https://github.co 11/10 17:20
clh960524: m/simdjson/simdjson/pull/2026 11/10 17:20
tinlans: 你先好好描述你正在解決什麼問題,不是要你描述為什麼要 11/12 04:02
tinlans: 用到這樣的語法或者語言機制上的需求,而是你的程式本身 11/12 04:03
tinlans: 是寫來替你達成什麼目的。這目的是那種講給非程式設計師 11/12 04:05
tinlans: 聽都聽得懂的那種,無關任何程式語言或語法。 11/12 04:05
tinlans: 你的情況比較像是拿電鋸在轉開螺絲,然後問大家如何用 11/12 04:19
tinlans: 電鋸把螺絲轉開,但大家都疑惑平常沒人拿電鋸去轉開螺絲 11/12 04:19
tinlans: ,因此必須從你一開始到底想幹嘛開始理解才行。 11/12 04:20
tinlans: 有可能講清楚以後,大家才知道你根本連轉開這螺絲都不必 11/12 04:21
tinlans: ,這樣建議你別用電鋸或改用螺絲起子都只是在浪費時間。 11/12 04:22
tinlans: 所以你先用地理老師都聽得懂的方式說明一下你正在幹嘛。 11/12 04:28
wulouise: 樓上完美描述問問題應該先從context &use case開始 11/12 10:17
sarafciel: 電鋸轉螺絲這個比喻也太傳神XDDD 11/12 17:18
pnpncat: 你這個範例...要記得加上分號XD 11/12 23:36
johnjohnlin: CRTP真的很好用 11/14 15:30
Lipraxde: CRTP 好用是好用,但是不要硬用哦XD 11/14 18:02
Lipraxde: 看過全寫 template 的地方在用 CRTP Orz 11/14 18:02