私はLinuxで書いたコードで奇妙な動作を見ましたが、誰かがその原因を知っているかどうかを知りたいと思っています。 私は基底クラスと派生クラスを持っていました。基本クラスでは、仮想メソッドを定義し、派生クラスで同じシグネチャでそのメソッドを再定義しました。その後、スレッドを起動するためにboostを使用しました。ここではサンプルコードです:私はこれをした派生クラスのInitメソッドで仮想関数とブーストバインドの奇妙な振る舞い
Class Base {
public:
virtual void DoSomething();
virtual void Init() = 0;
...
}
Class Derived : public Base {
public:
void DoSomething();
void Init();
...
}
:同じ方法ながら
boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
基底クラスのdoSomethingの方法は、それが行うことに意味されたものでした派生クラスの空のメソッドは、間違ってそこに残しました。上のコードを実行している間、ほとんどの場合、基本クラスのDoSomethingがスレッドで実行されたため、アプリケーションは正常に動作しましたが、時には機能しませんでした。いくつかのデバッグの後、私は上記の間違いに気付き、派生クラスのDoSomethingを削除することで問題が解決されました。 Eclipseをデバッグモードで使用すると、派生クラスのDoSomethingメソッドが常に呼び出されたように見えますが、コンソールからアプリケーションを実行するのは大抵の場合、常にそうではありませんでした。この行動の理由はありますか?つまり、なぜバインド関数が基本クラスのメソッドを使用するのはなぜですか、時には派生クラスの同じメソッドを使用するのはなぜですか?完全な実施例を示すことは難しいだろう
を@pmrに応答して、事前
編集中
おかげで、私はクラスがどのように使用されるかビットを表示しようとします。
最初に私はDerivedオブジェクトをインスタンス化し、次にinit関数で上記の初期化コードでスレッドを開始します。 DoSomethingには、ベクトルを反復するwhileループがありますが、それは私が思うところではありません。
void Derived::Init()
{
...
boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
}
void Base::DoSomething()
{
while(true) {
...
}
}
void Derived::DoSomething()
{
}
あなたは、このコードで派生doSomethingの方法を見ることができるようには空だったので、時々私の代わりにベースdoSomethingの機能で行われた任意の処理を、表示されませんでした。
最小限のコンパイル可能な例を提供してください。あるいは、クラスがどのように使用されているかを少なくとも示してください。 – pmr