class A
{
public:
virtualvoid f()
{
Print("1");
}
};
class B: public A
{
public:
virtualvoid f()
{
Print("2");
}
};
voidOnStart()
{
A* ptr1 = new B();
ptr1.f();
A* ptr2 = new A();
ptr2.f();
B* casted = dynamic_cast<B*>(ptr1);
casted.f();
B* casted1 = dynamic_cast<B*>(ptr2);
casted1.f(); // здесь должна быть ошибка потому что casted1 должен быть null
delete ptr1;
delete ptr2;
}
вывод:
2017.05.13 18:30:14.864 t ETHUSD,M5: 2
2017.05.13 18:30:14.865 t ETHUSD,M5: 1
2017.05.13 18:30:14.866 t ETHUSD,M5: 2
2017.05.13 18:30:14.867 t ETHUSD,M5: 2
もちろんです。
本当ですか?なぜなら、dynamic_castは親から子へのボトムアップの変換に最もよく使われるからです。
しかも、MQLでは、本来なら鋳造できないはずの下から上へも完璧に鋳造できるのです。
ここで、MQL5のコードフラグメントをご覧ください。
そう、うまくいかないはずで、それはすでに上で説明されていることですが、ボトムアップキャストが不可能だからではありません。
ポインタを上から下へ、つまり親へキャストした後、そのポインタをスコープ内のどこかへ渡すと、子孫のフィールドはそこで利用可能になるのでしょうか?
はい、ご質問の例を挙げます。
と出力します。まず、未解決のキャストを下から順にチェックし、NULLを取得します。これは正しい。
次に、CLASS2オブジェクトを作成し、その親クラスへの参照を割り当てます(ここで重要なのは、CLASS2オブジェクトの元の型がそのメタ情報に格納されていることを、環境が動的に知っていることです)。次に、(ご質問のように)参照 CLASS1 から CLASS2 に動的にキャストします(ソースオブジェクトのメタ情報に基づく変換権チェック付き)。
キャストの結果を確認し、変数i = 1に書き込む。最後に、最初に作成したオブジェクトを 参照しながら、iの値を出力します。
すべてが正しく、仕様通りに動作します(C++自体のdynamic_cast仕様も含む)。
本当ですか?なぜなら、dynamic_castは親から子へのボトムアップの変換に最もよく使われるからです。
しかも、MQLでは、本来なら鋳造してはいけないところでも、下から上へ完璧に鋳造してしまうのです。
その通りです。
最新のビルドにアップデートすることをお忘れなく。現在、1598でテストしていますが、このスレッドに最近zip形式で投稿されたものだと思います。
最新のビルドにアップデートすることをお忘れなく。
そう、旧ビルドです。
そうなんです、下から上への運転はできず、上から下への運転しかできないんです。これは安全のためです。
そう、旧ビルドです。
これは誤解を招きやすいし、dynamic_castの機能とも直接矛盾している。CLASS1→CLASS2の頭文字をとったキャスティングの例として上げられた通り、正しく理解されましたね。そういうキャスティングが、ほとんどの人の頭の中にあるんです。
また、dynamic_castの安全性チェックの核となるのは、「下から上にはキャストできず、上から下へしかキャストできない」という点です。
分かる人には分かる、dynamic_castの真髄。
最新のビルドにアップデートすることをお忘れなく。現在、1598でテストしていますが、これは最近このスレッドにzipとして投稿されたものだと思います。
コンパイラとエグゼキュータはどのようなexeファイルに収まっているのですか?
今、MT4b1080はMEb1599を動かしています。metaeditor.exeとterminal.exeが何をするものなのか説明してください。
コンパイラとエグゼキュータはどのようなexeファイルに収まっているのですか?
MT4b1080は、現在MEb1599が動作しています。metaeditor.exeとterminal.exeが何をするものなのか説明してください。
両プラットフォームのコンパイラは同じものです。metaeditor.exeの中にあります。
また、同じdynamic_castをチェックするexecutorは、terminal.exeにあるのでしょうか?
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
fxsaber さん 2017.05.11 13:26
なぜEX5なのか重さは5kbですか?