there is a good practice that is called "one point of entry, one point of exit". It means that it's better to have only one return in a function.
For now, your function is simple, but in the future, it may grow, become more complicated, allocate temporary variables which have to be freed, etc.
So it's better to use good practices everywhere. It's called "defensive programming", defense against human failures (mine and my colleagues').
I would write it this way :
bool Test(SampleType sample)
{
bool bRet = true; // by default, set it to the most "defensive" value which will cause the less harm or make the problem evident
// in the future, you may have inits and allocations here
if ( !SubTest1(sample) )
bRet = false; // don't match
else if ( !SubTest2(sample) )
bRet = false; // don't match
else if ( !SubTest3(sample) )
bRet = false; // don't match
else
; // bRet stays true
// thanks to the single point of exit, you can do things like that
if (bRet)
log("... match");
else
log("...no match")
// here you clean temporary resources...
return bRet;
}
If you want to improve performance, the best way is to put the SubTestX functions in the best order so that the one that doesn't match most often is first, so less tests are needed to find that it doesn't match.