First, you should make sure that inheritance is really the right tool here for the job - only because you need a common place for functions used by your classes A to F does not mean that a common base class is the right thing here - sometimes a separate helper class does the job better. It may be, it may be not. That depends on having a "is-a" relationship between A to F and your common base class, impossible to say from artificial names A-F. Here you find a blog post dealing with this topic.
Let's assume you decide that the common base class is the right thing in your case. Then
the second thing I would do is to make sure your code fragments S1 to S5 are each implemented in a separate methods S1() to S5() of your base class. Afterwards the "ExecJob" functions should look like this:
A::ExecJob()
{
S1();
S2();
S3();
S4();
S5();
}
B::ExecJob()
{
S1();
S3();
S4();
S5();
}
C::ExecJob()
{
S1();
S3();
S4();
}
As you see now, since S1 to S5 are just method calls, no code blocks any more, the code duplication has been almost completely removed, and you don't need any parameter checking any more, avoiding the problem of increasing complexity you might get otherwise.
Finally, but only as a third step(!), you might think about combining all those ExecJob methods into one of your base class, where the execution of those parts may be controlled by parameters, just the way you suggested it, or by using template method pattern. You have to decide yourself if that's worth the effort in your case, based on the real code.
But IMHO the basic technique to break down big methods into small methods is much, much more important for avoiding code duplication than applying patterns.