[問題] c++ 繼承問題

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

Links booklink

Contact Us: admin [ a t ] ucptt.com