Suppose I begin a package:

    BeginPackage["MyPackage`"];

Before running this command in a fresh kernal, the context and path were:

    ContextPath->$Context

> {"System\`", "Global\`"} -> "Global`"

and afterward:

> {"MyPackage\`", "System\`"} -> "MyPackage`"

Now if I were to declare a function `Fun1`:

    Fun1::"usage" = "Fun1[]";

The context of Fun1 is obviously `Context[Fun1]`:

> "MyPackage`"

Now if I begin a subcontext inside this context:

    Begin["`Private`"];

Now my context and path are:

> {"MyPackage\`", "System\`"} -> "MyPackage\`Private`"

Now if I try to define a new function with the same name `Fun1` here in the subcontext:

    Fun1[arg_] := 1 + 1;

It gets defined in "MyPackage\`" context whilst clearly the current context right now was 
"MyPackage\`Private\`".

If I were to use a different name say `Fun2` here then it gets defined in the subcontext as expected:

    Fun2[arg_] := 1 + 2;

Why is that? I am trying to understand the rules governing this. Does it mean if you are in a subcontext and there is a symbol with the same name existing in the outer context then the current context given by `$Context` is ignored if you define without using full context name?

    MyPackage`Private`Fun1[arg_] := 1 + 3;

was the effect I was expecting. Is this rule general in terms of how deeply nested the current context is compared to where the symbol with the same name exists in the outer context?