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