C Вызов родительской виртуальной функции из указателя

#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 или нет.