27
struct TimerEvent
{
   event Event;
   timeval TimeOut;
   static void HandleTimer(int Fd, short Event, void *Arg);
};

HandleTimerはCライブラリ(libevent)に渡すため、静的である必要があります。

このクラスから継承したい。これはどのように行うことができますか?

ありがとう。

4

3 に答える 3

41

そのクラスから簡単に継承できます。

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」として渡すようにしてください。

于 2009-02-05T12:49:59.087 に答える
25

ある程度、特性パターンを使用すると、静的メソッドを継承および再定義できます。

まず、基本クラスから始めます。

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です。

于 2015-06-12T07:11:58.257 に答える
0

あなたの質問には少し矛盾があります。&TimerEvent::TimerHandlerC ライブラリに渡すときは、まさにそれを行います。必要に応じて、合格することもでき&DerivedTimerEvent::TimerHandlerます。しかし&TimerEvent::TimerHandlerC ライブラリ(!) が実際に&DerivedTimerEvent::TimerHandler.

于 2009-02-06T09:58:09.247 に答える