struct TimerEvent
{
event Event;
timeval TimeOut;
static void HandleTimer(int Fd, short Event, void *Arg);
};
HandleTimer需要是静态的,因为我将它传递给C库(libevent)。
我想继承这个班级。怎么办呢?
感谢。
答案 0 :(得分:40)
您可以轻松地从该类继承:
class Derived: public TimerEvent {
...
};
但是,您不能在子类中覆盖HandleTimer并期望它能够工作:
TimerEvent *e = new Derived();
e->HandleTimer();
这是因为静态方法在vtable中没有条目,因此不能是虚拟的。但是,您可以使用“void * Arg”将指针传递给您的实例......类似于:
struct TimerEvent {
virtual void handle(int fd, short event) = 0;
static void HandleTimer(int fd, short event, void *arg) {
((TimerEvent *) arg)->handle(fd, event);
}
};
class Derived: public TimerEvent {
virtual void handle(int fd, short event) {
// whatever
}
};
这样,HandleTimer仍然可以在C函数中使用,只需确保始终将“真实”对象作为“void * Arg”传递。
答案 1 :(得分:13)
在某种程度上,traits模式允许您继承和重新定义静态方法。
首先从基类开始:
struct base {
static void talk() { std::cout << "hello" << std::endl; }
static void shout() { std::cout << "HELLO !!" << std::endl; }
};
然后派生它并重新定义一些方法:
struct derived: public base {
static void talk() { std::cout << "goodbye" << std::endl; }
};
现在通过traits类调用方法:
template < class T >
struct talker_traits {
static void talk() { T::talk(); }
static void shout() { T::shout(); }
};
talker_traits<base>::talk() // prints "hello"
talker_traits<base>::shout() // prints "HELLO !!"
talker_traits<derived>::talk() // prints "goodbye"
talker_traits<derived>::shout() // prints "HELLO !!"
traits类允许您重用静态方法base::shout
,而#34;覆盖&#34; base::talk
derived::talk
f=1/T*i
。不过,实际继承有几个不同之处:
它也适用于静态字段和typedef,最好的例子是std::iterator_traits。
答案 2 :(得分:0)
你的问题中有一点冲突。当您将&TimerEvent::TimerHandler
传递给C库时,您就是这样做的。如果你愿意,你也可以通过&DerivedTimerEvent::TimerHandler
。但是你无法通过&TimerEvent::TimerHandler
并期望 C库(!)找出你实际上意味着&DerivedTimerEvent::TimerHandler
。