0

d.B::num以下のコードサンプルを見たとき、同じだと思ったのb.numですが違います。独自のアドレスを持つ別の変数のようです。実行ボタンをクリックすると、3 つの変数がそれぞれ表示され、それぞれに関連付けb.numられた値 (それぞれ 3、4、5) が表示されます。d.numd.B::num

どうしてこんなことに?そしてd.B::num、それが と同じでない場合、ここには正確には何がありますb.numか?

struct B {int num;};

struct D : public B {int num;};

int main() {

  B b;
  D d;

  b.num = 3;
  d.num = 4;
  d.B::num = 5;

  cout << b.num << endl;
  cout << d.num << endl;
  cout << d.B::num << endl;

  return 0;
}
4

2 に答える 2

1

クラスのインスタンスがあり、クラスがあります。それらは異なるものです。すべての整数が同じ値ではないのと同じように、クラスの異なるインスタンスは同じ値ではありません。

派生クラスが基本クラスから継承する場合、派生クラスのインスタンスには、その内部に基本クラスのインスタンス (実際にはサブインスタンス) があります。

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です。

上記のいくつかは、標準によって正確に指示されているわけではありませんが、コンパイラが例示目的で標準を実装する方法です。

于 2013-06-07T08:23:04.610 に答える