[問題] c++ 繼承問題

看板C_and_CPP (C/C++)作者 (Poker Face)時間5月前 (2023/11/10 08:43), 編輯推噓14(14044)
留言58則, 14人參與, 5月前最新討論串2/2 (看更多)
想請問一個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

11/10 08:45, 5月前 , 1F
可以說說想要這樣設計的理由嗎?
11/10 08:45, 1F

11/10 08:46, 5月前 , 2F
你為什麼需要一個 Base::foo() 的「介面」在那裡?
11/10 08:46, 2F

11/10 08:54, 5月前 , 3F
Derived會有很多個,例如Derived_A,Derived_B等等
11/10 08:54, 3F

11/10 08:54, 5月前 , 4F
主要目的是希望Derived不要忘了去時做出foo的內容.
11/10 08:54, 4F

11/10 08:54, 5月前 , 5F
然後又想要可以沒有instance的時候使用foo()這個api
11/10 08:54, 5F

11/10 08:56, 5月前 , 6F
如果Derived不會忘了去做出foo的內容的話, 應該就
11/10 08:56, 6F

11/10 08:57, 5月前 , 7F
沒有這個問題, 想問一下大家的看法
11/10 08:57, 7F

11/10 09:01, 5月前 , 8F
所以你的各 Derived 只是各種可以 foo 的標記?
11/10 09:01, 8F

11/10 09:01, 5月前 , 9F
因為你想靜態使用, 這表示各 Derived 不會有成員
11/10 09:01, 9F

11/10 09:01, 5月前 , 10F
那各 Derived 之間的差別就僅僅是 foo 實作不同而已
11/10 09:01, 10F

11/10 09:06, 5月前 , 11F
回到「不會忘了去做出foo的內容」這句話, 為什麼你會想要
11/10 09:06, 11F

11/10 09:06, 5月前 , 12F
Derived 「不會忘了實作一個靜態方法」? 有誰會用嗎?
11/10 09:06, 12F

11/10 09:08, 5月前 , 13F
Derived會有其他的內容。 不是只有一個foo functio
11/10 09:08, 13F

11/10 09:08, 5月前 , 14F
n
11/10 09:08, 14F

11/10 09:10, 5月前 , 15F
抱歉 我晚點把使用情境描述的更清楚一點。這樣太模
11/10 09:10, 15F

11/10 09:10, 5月前 , 16F
糊,應該很難給意見。
11/10 09:10, 16F

11/10 09:11, 5月前 , 17F
等等會重新編輯文章。
11/10 09:11, 17F

11/10 09:18, 5月前 , 18F
不能使用嗎? 還是你需要的是static? 沒要動態轉型
11/10 09:18, 18F

11/10 09:18, 5月前 , 19F
可以用concept
11/10 09:18, 19F

11/10 10:00, 5月前 , 20F
USECASE列出來吧..
11/10 10:00, 20F

11/10 10:54, 5月前 , 21F
其實 concept (或 pre-C++20 用 SFINAE) 應該八成是他要的
11/10 10:54, 21F

11/10 10:55, 5月前 , 22F
這樣甚至不需要一個 "Base" 在那裡
11/10 10:55, 22F

11/10 10:55, 5月前 , 23F
但我好像很少看到這類型的限定會用在 static 成員函數上
11/10 10:55, 23F

11/10 11:10, 5月前 , 24F
Derived 有實作 foo 的話,為什麼要回頭用 Base::foo?
11/10 11:10, 24F

11/10 11:13, 5月前 , 25F
哦~看懂了XD
11/10 11:13, 25F

11/10 11:39, 5月前 , 26F
如果你可以呼叫static來解決問題,那就不用virtual啊。
11/10 11:39, 26F

11/10 11:39, 5月前 , 27F
本來就該分兩個方法,有實體就用virtual,沒實體呼叫st
11/10 11:39, 27F

11/10 11:39, 5月前 , 28F
atic。不然就是必定有實體,static的方法寫在base。
11/10 11:39, 28F

11/10 11:42, 5月前 , 29F
每個derived都要不同實作還是大家都要一樣的?
11/10 11:42, 29F

11/10 11:43, 5月前 , 30F
我覺得你要的是free function在不同namespace
11/10 11:43, 30F

11/10 12:29, 5月前 , 31F
寫 TMP 會有這種需要多個 class 實作同一個靜態函數的要
11/10 12:29, 31F

11/10 12:29, 5月前 , 32F
求,但如果原 Po 是在寫 TMP 大概也不會來問這問題
11/10 12:29, 32F

11/10 12:47, 5月前 , 33F
用derive* call foo不是你要的嗎
11/10 12:47, 33F

11/10 13:24, 5月前 , 34F
在base class加上function pointer,然後derived class都
11/10 13:24, 34F

11/10 13:24, 5月前 , 35F
需要實作 foo去修改這個function pointer指向的真正的實
11/10 13:24, 35F

11/10 13:24, 5月前 , 36F
作函數
11/10 13:24, 36F

11/10 16:15, 5月前 , 37F
impl Foo for Derived (Rust來亂x
11/10 16:15, 37F

11/10 17:17, 5月前 , 38F
假如原 PO 是問 derived class 腰實作 base class 的
11/10 17:17, 38F

11/10 17:17, 5月前 , 39F
一個 function,且為了最好效能,該 function 一定要
11/10 17:17, 39F

11/10 17:17, 5月前 , 40F
template,可以參考 CRTP
11/10 17:17, 40F

11/10 17:20, 5月前 , 41F
要實際範例的話,可以參考這個 PR:https://github.co
11/10 17:20, 41F

11/10 17:20, 5月前 , 42F
m/simdjson/simdjson/pull/2026
11/10 17:20, 42F

11/12 04:02, 5月前 , 43F
你先好好描述你正在解決什麼問題,不是要你描述為什麼要
11/12 04:02, 43F

11/12 04:03, 5月前 , 44F
用到這樣的語法或者語言機制上的需求,而是你的程式本身
11/12 04:03, 44F

11/12 04:05, 5月前 , 45F
是寫來替你達成什麼目的。這目的是那種講給非程式設計師
11/12 04:05, 45F

11/12 04:05, 5月前 , 46F
聽都聽得懂的那種,無關任何程式語言或語法。
11/12 04:05, 46F

11/12 04:19, 5月前 , 47F
你的情況比較像是拿電鋸在轉開螺絲,然後問大家如何用
11/12 04:19, 47F

11/12 04:19, 5月前 , 48F
電鋸把螺絲轉開,但大家都疑惑平常沒人拿電鋸去轉開螺絲
11/12 04:19, 48F

11/12 04:20, 5月前 , 49F
,因此必須從你一開始到底想幹嘛開始理解才行。
11/12 04:20, 49F

11/12 04:21, 5月前 , 50F
有可能講清楚以後,大家才知道你根本連轉開這螺絲都不必
11/12 04:21, 50F

11/12 04:22, 5月前 , 51F
,這樣建議你別用電鋸或改用螺絲起子都只是在浪費時間。
11/12 04:22, 51F

11/12 04:28, 5月前 , 52F
所以你先用地理老師都聽得懂的方式說明一下你正在幹嘛。
11/12 04:28, 52F

11/12 10:17, 5月前 , 53F
樓上完美描述問問題應該先從context &use case開始
11/12 10:17, 53F

11/12 17:18, 5月前 , 54F
電鋸轉螺絲這個比喻也太傳神XDDD
11/12 17:18, 54F

11/12 23:36, 5月前 , 55F
你這個範例...要記得加上分號XD
11/12 23:36, 55F

11/14 15:30, 5月前 , 56F
CRTP真的很好用
11/14 15:30, 56F

11/14 18:02, 5月前 , 57F
CRTP 好用是好用,但是不要硬用哦XD
11/14 18:02, 57F

11/14 18:02, 5月前 , 58F
看過全寫 template 的地方在用 CRTP Orz
11/14 18:02, 58F
文章代碼(AID): #1bJNp73F (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1bJNp73F (C_and_CPP)