struct TimerEvent
{
event Event;
timeval TimeOut;
static void HandleTimer(int Fd, short Event, void *Arg);
};
HandleTimerはCライブラリ(libevent)に渡すため、静的である必要があります。
このクラスから継承したい。これはどのように行うことができますか?
ありがとう。
struct TimerEvent
{
event Event;
timeval TimeOut;
static void HandleTimer(int Fd, short Event, void *Arg);
};
HandleTimerはCライブラリ(libevent)に渡すため、静的である必要があります。
このクラスから継承したい。これはどのように行うことができますか?
ありがとう。
そのクラスから簡単に継承できます。
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」として渡すようにしてください。
ある程度、特性パターンを使用すると、静的メソッドを継承および再定義できます。
まず、基本クラスから始めます。
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; }
};
次に、特性クラスを介してメソッドを呼び出します。
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
で「オーバーライド」base::talk
しながら静的メソッドを再利用できますderived::talk
。それでも、実際の継承とはいくつかの違いがあります。
静的フィールドと typedef でも機能します。最良の例はstd::iterator_traitsです。
あなたの質問には少し矛盾があります。&TimerEvent::TimerHandler
C ライブラリに渡すときは、まさにそれを行います。必要に応じて、合格することもでき&DerivedTimerEvent::TimerHandler
ます。しかし&TimerEvent::TimerHandler
、C ライブラリ(!) が実際に&DerivedTimerEvent::TimerHandler
.