【发布时间】:2016-10-01 23:20:14
【问题描述】:
假设我们有一个被继承的抽象基类:
class Base
{
protected:
Base() {}
virtual ~Base() {}
virtual void on_event_foo(int) {}
virtual void on_event_bar(int) {}
};
struct Concrete : public Base
{
virtual void on_event_foo(int value) {/*do some stuff with @value*/}
};
这是一种知道(在编译时最好)被覆盖的Base 中的virtual 函数(在构造函数中使用一些代码,或使用特殊模式)的方法吗?
我的目的是为使用一些回调的库实现一个包装器;如果我可以检查被覆盖的函数,我将只创建用户想要的回调。
我希望用户可以选择他想要覆盖的功能。然后在我的代码中,我将只为被覆盖的函数创建回调。纯 virtual 函数不是解决方案,因为它们不能在不覆盖所有函数的情况下创建具体类。
在Base 的构造函数中,目前,我在C API 中连接了Base 的很多 静态回调函数。在这些函数中,我调用了相应的成员函数。例如,回调函数是static Base::EventFoo(/* ... */),它在object->on_event_foo(/* .. */) 内部调用。这是因为我不能将成员函数作为 C 库的回调。
但是创建太多回调会使我的包装器变慢。所以,我只想连接用户想要的回调,即知道那里的函数被他覆盖。
【问题讨论】:
-
使基类中的函数成为纯虚函数:
virtual void on_event_foo(int) = 0;. -
@Boiethios 对我来说听起来像是一个设计缺陷。如果派生类是否覆盖了函数,你应该让你的代码完全透明。
-
我已将“overload”替换为“override”。如果你能给出一个你想要什么的例子,那就太好了。你最后的几句话不清楚。
-
在编译时通常不知道,因此在编译时您无法检测到它。最多可能要等到链接时间才能知道。 XY 问题。
-
正式地说,这不是一个 abstract 类。在 C++ 中,一个抽象类至少有一个纯虚函数。
标签: c++ templates inheritance virtual-functions