確認した環境
- Windows10
- Visual Studio Community 2019 Version 16.2.5
本題
前回の記事で 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 メンバ関数は仮想化できません。