EXP12.Super::XXXX() 中 return 不会中断子类函数执行的问题
大约 1 分钟
问题描述
问题复现
void UExorcistViewModelBase::Initialize()
{
Super::Initialize();
if (bInitialized) return;
bInitialized = true;
check(DataCollection);
}
void UVM_LobbyHero::Initialize()
{
Super::Initialize();
UKismetSystemLibrary::PrintString(this,CurrentInfo.SelectedCategory.ToString(), true, true, FColor::Blue);
}
问题提出
问题解答
1. return
只作用于当前函数
- 在 C++ 中,
return;
语句只会让当前执行的函数立即结束。 - 也就是说,
UExorcistViewModelBase::Initialize()
在遇到return
后会停止执行父类自己的剩余代码,并返回到子类继续执行子类的Initialize()
后续内容。 - 不会因为父类
return;
,而中断子类Initialize()
的流程。
2. 函数调用有调用栈
- 调用栈里是按层级顺序压入的。
- 子类
Initialize()
调用Super::Initialize()
→ 进入父类 → 父类执行结束 → 返回子类继续执行。
示意流程:
子类 Initialize()
└── 调用 → 父类 Initialize()
└── (父类遇到 return 提前结束)
└── 返回 → 继续子类 Initialize() 后续代码
解决方案
void UVM_LobbyHero::Initialize()
{
Super::Initialize();
// 子类也要加这一行!
if (bInitialized)
return;
}