作者kakar0to (Poker Face)
看板C_and_CPP
标题[问题] c++ 继承问题
时间Fri Nov 10 08:43:48 2023
想请问一个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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1699577031.A.0CF.html
1F:推 LPH66: 可以说说想要这样设计的理由吗? 11/10 08:45
2F:→ LPH66: 你为什麽需要一个 Base::foo() 的「介面」在那里? 11/10 08:46
3F:→ kakar0to: Derived会有很多个,例如Derived_A,Derived_B等等 11/10 08:54
4F:→ kakar0to: 主要目的是希望Derived不要忘了去时做出foo的内容. 11/10 08:54
5F:→ kakar0to: 然後又想要可以没有instance的时候使用foo()这个api 11/10 08:54
6F:→ kakar0to: 如果Derived不会忘了去做出foo的内容的话, 应该就 11/10 08:56
7F:→ kakar0to: 没有这个问题, 想问一下大家的看法 11/10 08:57
8F:推 LPH66: 所以你的各 Derived 只是各种可以 foo 的标记? 11/10 09:01
9F:→ LPH66: 因为你想静态使用, 这表示各 Derived 不会有成员 11/10 09:01
10F:→ LPH66: 那各 Derived 之间的差别就仅仅是 foo 实作不同而已 11/10 09:01
11F:→ LPH66: 回到「不会忘了去做出foo的内容」这句话, 为什麽你会想要 11/10 09:06
12F:→ LPH66: Derived 「不会忘了实作一个静态方法」? 有谁会用吗? 11/10 09:06
13F:→ kakar0to: Derived会有其他的内容。 不是只有一个foo functio 11/10 09:08
14F:→ kakar0to: n 11/10 09:08
15F:→ kakar0to: 抱歉 我晚点把使用情境描述的更清楚一点。这样太模 11/10 09:10
16F:→ kakar0to: 糊,应该很难给意见。 11/10 09:10
17F:→ kakar0to: 等等会重新编辑文章。 11/10 09:11
18F:推 sanctitysky: 不能使用吗? 还是你需要的是static? 没要动态转型 11/10 09:18
19F:→ sanctitysky: 可以用concept 11/10 09:18
20F:推 wulouise: USECASE列出来吧.. 11/10 10:00
21F:→ LPH66: 其实 concept (或 pre-C++20 用 SFINAE) 应该八成是他要的 11/10 10:54
22F:→ LPH66: 这样甚至不需要一个 "Base" 在那里 11/10 10:55
23F:→ LPH66: 但我好像很少看到这类型的限定会用在 static 成员函数上 11/10 10:55
24F:→ Lipraxde: Derived 有实作 foo 的话,为什麽要回头用 Base::foo? 11/10 11:10
25F:推 Lipraxde: 哦~看懂了XD 11/10 11:13
26F:→ s4300026: 如果你可以呼叫static来解决问题,那就不用virtual啊。 11/10 11:39
27F:→ s4300026: 本来就该分两个方法,有实体就用virtual,没实体呼叫st 11/10 11:39
28F:→ s4300026: atic。不然就是必定有实体,static的方法写在base。 11/10 11:39
29F:推 wulouise: 每个derived都要不同实作还是大家都要一样的? 11/10 11:42
30F:→ wulouise: 我觉得你要的是free function在不同namespace 11/10 11:43
31F:推 CoNsTaR: 写 TMP 会有这种需要多个 class 实作同一个静态函数的要 11/10 12:29
32F:→ CoNsTaR: 求,但如果原 Po 是在写 TMP 大概也不会来问这问题 11/10 12:29
33F:推 johnjohnlin: 用derive* call foo不是你要的吗 11/10 12:47
34F:推 Lhmstu: 在base class加上function pointer,然後derived class都 11/10 13:24
35F:→ Lhmstu: 需要实作 foo去修改这个function pointer指向的真正的实 11/10 13:24
36F:→ Lhmstu: 作函数 11/10 13:24
37F:→ lycantrope: impl Foo for Derived (Rust来乱x 11/10 16:15
38F:推 clh960524: 假如原 PO 是问 derived class 腰实作 base class 的 11/10 17:17
39F:→ clh960524: 一个 function,且为了最好效能,该 function 一定要 11/10 17:17
40F:→ clh960524: template,可以参考 CRTP 11/10 17:17
42F:→ clh960524: m/simdjson/simdjson/pull/2026 11/10 17:20
43F:→ tinlans: 你先好好描述你正在解决什麽问题,不是要你描述为什麽要 11/12 04:02
44F:→ tinlans: 用到这样的语法或者语言机制上的需求,而是你的程式本身 11/12 04:03
45F:→ tinlans: 是写来替你达成什麽目的。这目的是那种讲给非程式设计师 11/12 04:05
46F:→ tinlans: 听都听得懂的那种,无关任何程式语言或语法。 11/12 04:05
47F:→ tinlans: 你的情况比较像是拿电锯在转开螺丝,然後问大家如何用 11/12 04:19
48F:→ tinlans: 电锯把螺丝转开,但大家都疑惑平常没人拿电锯去转开螺丝 11/12 04:19
49F:→ tinlans: ,因此必须从你一开始到底想干嘛开始理解才行。 11/12 04:20
50F:→ tinlans: 有可能讲清楚以後,大家才知道你根本连转开这螺丝都不必 11/12 04:21
51F:→ tinlans: ,这样建议你别用电锯或改用螺丝起子都只是在浪费时间。 11/12 04:22
52F:→ tinlans: 所以你先用地理老师都听得懂的方式说明一下你正在干嘛。 11/12 04:28
53F:推 wulouise: 楼上完美描述问问题应该先从context &use case开始 11/12 10:17
54F:推 sarafciel: 电锯转螺丝这个比喻也太传神XDDD 11/12 17:18
55F:→ pnpncat: 你这个范例...要记得加上分号XD 11/12 23:36
56F:推 johnjohnlin: CRTP真的很好用 11/14 15:30
57F:→ Lipraxde: CRTP 好用是好用,但是不要硬用哦XD 11/14 18:02
58F:→ Lipraxde: 看过全写 template 的地方在用 CRTP Orz 11/14 18:02
59F:推 nicofox: 原po问how 大家问why 有趣了 06/22 22:22