0

私はこの問題を抱えています:

struct A
{
  ... some const virtual members ...
};

struct B: A
{
  ... some const overrides ...
};

struct C
{
  C(std::initializer_list<A> const& list) // initialized with instances of B
  {
    for (auto const& a: list)
    {
      a.virtual_member_call(); // but struct B overloads do not get called
    }
  }
};

これは、BのインスタンスがAのインスタンスにコピーされるために発生します。この問題を回避するための回避策(ヒープからの割り当て以外)は何ですか?可変個引数テンプレートコンストラクターはそのようなものの1つである可能性があると思います。

4

1 に答える 1

2

それはスライスのために起こります。

std::initializer_list<>はポリモーフィックコンテナではなく、タイプが値の単純なコンテナですA。リストを作成するときに、オブジェクトがコピーされます。Aタイプのオブジェクトからタイプのオブジェクトをコピー構築する場合B、スライスが発生します。コピーA元のタイプの元のオブジェクトの「Aへの投影」であるタイプのオブジェクトになります。B

ポリモーフィック型の異種初期化子リストが必要な場合は、(スマート)ポインターの使用を検討してください。

于 2013-02-25T21:28:46.197 に答える