#c
#c
Вопрос:
У меня есть этот код:
void FAuCoreEditorModule::OnAssetEditorOpen(
UObject* EditObject
, IAssetEditorInstance* Toolkit)
{
FName NAme = Toolkit->GetEditorName();
if(Toolkit->GetEditorName() == "CurveTableEditor")
{
FAssetEditorToolkit* AET = static_cast<FAssetEditorToolkit*>(Toolkit);
AET->FAssetEditorToolkit::RegisterTabSpawners(AET->GetTabManager().ToSharedRef());
}
}
Это относится к Toolkit
типу ICurveTableEditor
.
RegisterTabSpawners
Является ли виртуальная функция внутри FAssetEditorToolkit
.
Curvetable_editor реализует его, но никогда не вызывает родительский. Я хотел вызвать родительскую реализацию, не изменяя исходный исходный код. Придумал это:
FAssetEditorToolkit* AET = static_cast<FAssetEditorToolkit*>(Toolkit);
AET->FAssetEditorToolkit::RegisterTabSpawners(AET->GetTabManager().ToSharedRef());
Это законно? Или это просто сработало случайно?
Ответ №1:
Это законно?
Потенциально да. Не обязательно.
Статическое понижение допускается, если IAssetEditorInstance
является невиртуальной однозначной базой FAssetEditorToolkit
и если указатель действительно относится к объекту такого типа (или типу с такой невиртуальной базой).
Если некоторые из этих ограничений не выполняются, вы можете использовать dynamic_cast
вместо этого (при условии, что база является полиморфной). Обязательно проверьте, возвращает ли она null или нет.