[问题] 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