クラスのインスタンスがあり、クラスがあります。それらは異なるものです。すべての整数が同じ値ではないのと同じように、クラスの異なるインスタンスは同じ値ではありません。
派生クラスが基本クラスから継承する場合、派生クラスのインスタンスには、その内部に基本クラスのインスタンス (実際にはサブインスタンス) があります。
virtual
キーワードが使用されていない場合、派生クラス インスタンスのサブ インスタンスは、基本的に、基本クラスの完全に通常のインスタンスです。base にあるものと同じ名前のメンバー変数を派生に作成する場合、base のサブインスタンスで変数を不用意に使用できないようにするだけです。ポインターまたはベースへの参照を介してアクセスするか、Base::x
構文で完全に修飾することにより、subinstances 隠し変数を引き続き取得できます。
static
変数にアクセスするように見えますが、このBase::x
構文は、base にあるものの名前を参照するためにも使用されますstatic
。
virtual
これは非ケースにのみ当てはまると述べました。現在、virtual
ベースのメソッドは派生でオーバーライドできます。メソッドは、ベースに格納された実際のメソッドへのポインターであると考えることができます。virtual
派生インスタンスを作成すると、派生インスタンスのベース サブオブジェクトのvirtual
メソッド ポインターが指しているものが派生メソッドに変更されます。その後、base へのポインタを持っていても、virtual
メソッドを呼び出すと派生メソッドを呼び出すことができます。
のもう 1 つの使用法virtual
は、継承する場合です。なしvirtual
で継承すると、インスタンスの「開始」で、継承の順序で説明されているように、基本クラスのインスタンスが順番に連結されるようになります。を使用して継承する場合virtual
、代わりに、基本インスタンスが派生オブジェクトに対して相対的な位置を示すオフセットの表があります。これは主に重要であり、特定の派生に base の複数のサブインスタンスを含めることができますが、継承virtual
は 1 つだけvirtual
です。
上記のいくつかは、標準によって正確に指示されているわけではありませんが、コンパイラが例示目的で標準を実装する方法です。