std::thread で純粋仮想関数を指定する

確認した環境

本題

前回の記事で std::thread にメンバー関数を渡すときについて書きましたが、 純粋仮想関数の場合を確認していなかったので今回確認します。
コードは以下の通りです。

class BaseClass {
public:
    BaseClass() = default;
    virtual ~BaseClass() = default;

    void run() {
        //th_ = std::thread(MyClass::member_func, this);    // NG
        //th_ = std::thread(member_func, this);             // NG
        //th_ = std::thread(&member_func, this);            // NG
        th_ = std::thread(&BaseClass::member_func, this);     // OK
    }

    void join() {
        th_.join();
    }

private:
    //virtual static void static_member_func() = 0; // NG
    virtual void member_func() = 0;
    std::thread th_;
};

class MyClass : public BaseClass {
public:
    explicit MyClass(int n) : n_(n) {}

private:
    void member_func() override {
        std::cout << "MyClass::member_func (n = " << n_ << ")" << std::endl;
    };

    int n_;
};

int main() {
    std::unique_ptr<BaseClass> base_class = std::make_unique<MyClass>(16);
    base_class->run();
    base_class->join();

    return 0;
}

上記のコードのように、std::thread の第一引数に基底クラスの純粋仮想関数のアドレスを渡せば、 以下の結果の通り派生クラスのオーバーライドしたメソッドを呼び出すことができます。

MyClass::member_func (n = 16)

ちなみに、static メンバ関数は仮想化できません。