0

いつものように、事前に感謝します...

私は classBaseと、Thing両方で定義されている class を持っていますbase.lib

Baseクラスには、保護された仮想関数があり、ご想像のcreateThing()とおり、のインスタンスを作成して返しますThing

今; また、別のプロジェクトがあります。「ガレージ」と呼びましょう。

このプロジェクトでは、Garage(公に) から派生したクラスがありBaseます。Carから派生するクラスも作成しますThing

ではGarage、オーバーライドcreateThing()して のインスタンスを返しますCar

わかった。

ここが複雑なところです。

Base私の場合、実際にワーカースレッドを作成します(スレッド本体を のプライベートメンバーとしてBase、別のクラスのメンバーとして配置しようとしました)。

そのワーカー スレッド内でcreateThing()は、次のようにポインターを介して呼び出されます。

Thing* thing = base->createThing();

単独でテストする場合、これは問題なくダンディBaseです。

ただし、新しいプロジェクトを作成して にリンクしbase.lib、説明どおりに myGarageCarクラスを作成するとすぐに、上記の行は常にコンストラクターを呼び出しますThingCar

誰かが私が間違っていることを説明してもらえますか?

ありがとう :)

編集: この例 (および実際のコード) では、変数baseDEFINATLY は次のインスタンスを指します。Garage

私が試した別のテストでは、Garage(スタック上に作成された) my をBaseポインターにキャストしてから を呼び出すとbase->createThing()、期待どおりに動作します。

base->createThing()この問題が発生するのは、ワーカースレッドに呼び出しをさせたときだけです

4

1 に答える 1

0

これはある種のリンクの問題または無関係の問題であると考え始めているため、質問を閉じるために自分でこれに答えています。すべてのコメントは大歓迎でした、ありがとう!!

編集:プロジェクトを完全に削除してからやり直すとうまくいきました。何が問題だったのか想像できませんが、おそらくVC++の奇妙なバグです

皆さんありがとう!

于 2013-07-01T15:43:54.983 に答える