いつものように、事前に感謝します...
私は 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
、説明どおりに myGarage
とCar
クラスを作成するとすぐに、上記の行は常にコンストラクターを呼び出しますThing
。Car
誰かが私が間違っていることを説明してもらえますか?
ありがとう :)
編集: この例 (および実際のコード) では、変数base
DEFINATLY は次のインスタンスを指します。Garage
私が試した別のテストでは、Garage
(スタック上に作成された) my をBase
ポインターにキャストしてから を呼び出すとbase->createThing()
、期待どおりに動作します。
base->createThing()
この問題が発生するのは、ワーカースレッドに呼び出しをさせたときだけです