0

仮想基本クラスに関連する質問があります。

class a
{
public:
  a();
  ~a();
};

class b: virtual public a
{
public:
  b();
  ~b();
};

class c: virtual public a
{
public:
  c();
  ~c();
};

class e: public b, c
{
public:
  e();
  ~e();
};

クラス のオブジェクトを作成するときはいつでもe、どのクラスを介してaオブジェクトが作成されeますか?

4

2 に答える 2

2

両方、共有されます。

質問がレイアウトに関するものである場合、これは指定されていません。はい、仮想継承を使用すると、オブジェクトが完全なオブジェクトではない場合、メモリ内で非連続になる可能性があります。

a にデフォルトのコンストラクターがない場合は、必要なパラメーターを提供する初期化リストが e に必要です。b と c のコンストラクターによって暗示されたものは無視されます。

于 2012-06-20T12:40:48.197 に答える
1

単一の共有インスタンスが存在します。

A へのメモリ オフセットは実行時まで不明であるため、コンパイラはクラス B と C の両方に vpointer を与えます。E のインスタンスを作成すると、A、B、C のインスタンスも作成されます。

B と C はどちらも、クラス A へのオフセットを格納する vtable に仮想ポインターを含みます。これは、実行時に共有 A オブジェクトを指すために使用されます。

于 2012-06-20T13:03:23.583 に答える