1

次のような状況では、オブジェクトのスライスを無視できないのではないかと考えていました。

class Base
{
  private:
    int8_t data[128];
    // other variables

  protected:
    Base(args) : args(args) { }
    void setData(uint8_t i, int8_t d) { data[i] = d; }

  public:
    void doSomethingWithData() { ... }
}

class Derived
{
  public:
    Derived(args) : Base(args)
    {
      setData(...);
      setData(...);
    }
}

Base array[] = {
  Derived(args),
  Derived2(args)
  ..
}

Base& any = array[0];

オブジェクトのスライスについて私が考えたことによると、特定のコピー/移動コンストラクター/代入演算子が失われたとしても、ここで失うものは何もないので、コンストラクターの呼び出しといくつかのデータの設定に制限されてDerivedいると仮定すると、安全な操作になる可能性があります。しかし、これは私が見落としている典型的な落とし穴かもしれません。DerivedBase

それについて保証された動作はありますか?

4

2 に答える 2

0

「スライスを無視できますか」という意味がわかりません。あなたの例ではスライスが発生します。必要に応じて無視してもかまいませんが、プログラムの動作は変わりません。ただし、あなたの例には特に問題はありません。私は何度も同様のコードを書いています。

于 2014-07-18T13:34:38.033 に答える