C++通过指针调用父类虚函数是否合法?基于UE代码的疑问
关于显式调用父类虚函数实现的合法性解析
先看你给出的代码:
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()); } }
针对你的问题:这个写法是完全合法的C++标准语法,绝非偶然可行,下面给你拆解细节:
核心原理分析
类型转换的安全性
你通过GetEditorName()确认了当前Toolkit指向的是CurveTableEditor实例,而CurveTableEditor必然继承自FAssetEditorToolkit(因为它实现了ICurveTableEditor接口,且重写了FAssetEditorToolkit的虚函数),所以这里的static_cast<FAssetEditorToolkit*>(Toolkit)是安全的——只要类型匹配,这个转换就不会产生未定义行为。显式调用父类虚函数的语法
AET->FAssetEditorToolkit::RegisterTabSpawners(...)这种写法是C++允许的直接调用父类虚函数实现的方式。它会绕过虚函数的动态绑定机制,强制调用FAssetEditorToolkit类中定义的RegisterTabSpawners版本,完全不受子类重写的影响。不管子类有没有实现这个函数,也不管子类有没有调用父类实现,你都可以用这种方式直接触发父类的逻辑。
注意事项
- 一定要确保类型转换的正确性:如果没有
GetEditorName()的判断,直接把任意IAssetEditorInstance*转换为FAssetEditorToolkit*,会导致未定义行为(比如崩溃、内存错误),你当前的判断已经规避了这个风险。 - 这种写法是标准C的特性,所有符合C标准的编译器(比如MSVC、GCC、Clang)都会支持,不存在编译器兼容性问题。
内容的提问来源于stack exchange,提问作者Łukasz Baran
相关产品推荐
相关产品推荐

