1

ヘッダーで宣言された2つのc++クラスがあります。ベースは仮想メソッドを宣言し、2番目のクラスがそれをオーバーライドします。実装は.cppファイルにあります。

コードはかなり単純です

void DefendProperty::apply(Queue<Defend*>* defendQueue, 
const Tool* toolSource, const Actor* actorSource, const Actor* defender) {
    cout << "BASE" << endl;
}

void DefendPropertyPhysical::apply(Queue<Defend*>* defendQueue, 
Tool* toolSource, const Actor* actorSource, const Actor* defender) {
    cout << "CORRECT" << endl;
    defendQueue->enqueue(new Defend(
        DefendTypePhysical::TYPE, 
        new DamageValuesPhysical(
        getRandomDouble(minDamageReduction, maxDamageReduction))
    ));
}

重要なのは、インスタンス化されたクラスをBと呼ぶと、CORRECTではなくBASEを出力するということです。この時点で何が起こっているのかわかりません。

クラスは、applyメソッドを持たない基本のToolPropertyタイプに格納されます。それらが呼び出されると、dynamic_castを使用してDefendPropertyタイプにタイプキャストされます。

dynamic_cast<DamageProperty*>(node->value)->apply(damageQueue, toolSource, actorSource);

どんな助けでもいただければ幸いです

4

3 に答える 3

3

派生クラスのメソッドのシグネチャは、基本クラスのメソッドのシグネチャとは異なります。(1つはconst Tool*、、もう1つは非constを取りますTool*

シグニチャが異なるため、派生クラスのメソッドは基本クラスのメソッドをオーバーライドしませんが、代わりに新しい無関係のメソッドを宣言します。

于 2012-05-07T18:43:04.993 に答える
1

関数には異なるシグネチャがあります。「toolSource」のタイプを確認してください。2番目は最初のオーバーライドではなく、過負荷です。

コンパイラが警告することはほとんどないというよくある間違い。とにかくそうするものを私は知りません。

ところで、動的キャストをポインターで使用し、結果を確認しない場合は、動的キャストを使用する理由はありません。

于 2012-05-07T18:43:01.457 に答える
0
  1. 関数のシグネチャが同じであることを確認してください。toolSourceでconstではありませんDefendPropertyPhysical。シグニチャが一致しない場合、c ++コンパイラは、ユーザーが間違いを犯したとは見なさず、そのメソッドの新しいオーバーロードを宣言していると見なします。C++11の明示的なオーバーライドはこれに役立ちます。

  2. ヘッダーにDefendProperty::applyマークが付いていることを確認してください。virtual

于 2012-05-07T18:42:54.337 に答える