C++ Builder 10.2 Tokyo > FindComponent()した結果をTEdit *に入れる場合 > dynamic_cast<TEdit *>と(TEdit *)キャストの違い


動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)

疑問

下記のコンポーネントがあるとする。

  • Edit1: TEdit
  • CheckBox1: TCheckBox

TEdit *edPtrにFindComponent()の結果を代入するとき、下記の違いはあるのか?

  1. dynamic_cast<TEdit *>
  2. (TEdit *)キャスト

code

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TEdit *edPtr;
    String msg = L"";

    // 1. dynamic_cast
    edPtr = dynamic_cast<TEdit*>(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"1a: Edit1(dynamic_cast): Exist\r\n";
    }

    edPtr = dynamic_cast<TEdit*>(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"1b: CheckBox1(dynamic_cast): Exist\r\n";
    }

    // 2. TEdit * cast
    edPtr = (TEdit *)(FindComponent("Edit1"));
    if (edPtr != NULL) {
        msg += L"2a: Edit1(TEdit * cast): Exist\r\n";
    }

    edPtr = (TEdit *)(FindComponent("CheckBox1"));
    if (edPtr != NULL) {
        msg += L"2b: CheckBox1(TEdit * cast): Exist\r\n";
    }

    ShowMessage(msg.c_str());

}
//---------------------------------------------------------------------------

結果

考察

  • dynamic_cast<TEdit *>の場合、異なる型のコンポーネントはNULLを返す
  • (TEdit *)の場合、異なる型のコンポーネントはNULLにならない。

型間違いの防止にはdynamic_cast<TEdit *>の方がいい。
一方で、下記の意見があることは付記しておく。

この dynamic_cast は安全にキャストしてくれるいいものなのですが、 「dynamic_cast は使うな」と言われています。

関連

使い分け

c++ builder XE4, 10.2 Tokyo > 格子状配置のTCheckBoxのCheckedを行列で取得する > Tagプロパティの使用
においては下記のようにしている (code v0.2のUnit1.cpp)。

  1. dynamic_cast<>にてコンポーネントがあることを確認
  2. (TCheckBox *)にてsrcPtrへ代入

この流れとdynamic_cast<>での代入の違いは何か。