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丢失了特定的复制/移动构造函数/赋值运算符,这里也没有什么可丢失的,因此它可能是一个安全的操作,假设任何Derived限制自己调用Base构造函数和设置一些数据。但这可能是我忽略的典型陷阱。

关于它的任何保证行为?

4

2 回答 2

0

我不确定“我可以忽略切片”是什么意思。切片将在您的示例中发生,如果您愿意,您显然可以随意忽略它,但这不会改变程序的行为。不过,我认为您的示例没有什么特别的问题。我曾多次编写过类似的代码。

于 2014-07-18T13:34:38.033 回答
0

由于派生类似乎没有添加任何状态或多态行为,因此切片似乎在这里可以正常工作。但我建议你还是不要那样做。

我认为一个更清晰和惯用的方法是返回你正在创建的东西的一系列函数,因为你没有使用任何可能调用继承的原因(通常是替换,偶尔私下继承一个实现):

Base TinyFont(png, colors) { /* create and return item */ }
Base SmallFont(png, colors) { /* create and return item */ }
于 2014-07-18T15:56:21.770 回答