What is the correct way to create and add components at runtime ?

I’ve read the link of Hatsune now; To take that link for example, I was asking that how to put Blueprint component class in this line: Audio = NewObject<UAudioComponent>(this);
So I’ve checked the source code of NewObject, looks like I could give the UClass parameter, so I might be able to do it like NewObject<SomeBaseClass>(this, The BP Component Class)?

But there’s a concern, that’s why I mentioned the function Actor::AddComponent, which is called by Blueprint’s Add Component node. Comparing Hatsune’s link to Actor::AddComponent, you can see that Actor::AddComponent is a lot more complicated than it, so I’m not sure if Hastune’s link is able to completely add a BP Component.