1)オーバーライド
例えば、以下のような2つのクラスがあったとします。

TParent = class
 procedure Show;
end;

TChild = class( TParent )
 procedure Show;
end;

上の宣言の意味はわかっているものとして話を進めます。
TChild は TPraent から派生しているので、当然親のメソッドである
Show も継承しているのですが、それを「上書き=再定義」していますね。
つまり、ここにある TChild.Show は、TParent.Show とは何の関係もありません。単に、「名前が同じである」だけです。

ここまでは良いですよね。ところで、クラスには
親クラスと、その派生クラスには代入互換性があります。
そこで、以下のコードを実行してみましょう。

var
 P: TParnet;
 C: TChild;
begin
 C := TChild;
 P := C;
 P.Show;
end;

ここで、 P.Show で実行されるメソッドは、TParnet.Show と
TChild.Show のどちらなのか? P は元々 TParent として宣言されていますが、実際に P に入っているのは TChild のほうですよね。

結論から言うと、この場合は TParent.Show が実行されます。当然です。
なんせ、P.Show の P は TParent ですからね

では、TChild の宣言を次のように変えてみます。

TParnet = class
 procedure Show; virtual;
end;

TChild = class( TParent )
 procedure Show; override;
end;

これで、もういちど先ほどのコードを実行しましょう。すると、
P.Show で呼び出されるのは、TChild.Show になります。
つまり、Pに「実際に入っているクラスによって、動的に呼び出される
メソッドが変化する」のです。これが、動的メソッドです。