没有其他实例方法和变量的对象切片

时间:2014-07-18 13:29:35

标签: c++ oop c++11 object-slicing

我想知道在类似以下的情况下我是否可以忽略对象切片:

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

关于它的任何保证行为?

2 个答案:

答案 0 :(得分:0)

我不确定你的意思是“我可以忽略切片”。切片将在您的示例中出现,如果您愿意,您显然可以忽略它,但这不会改变程序的行为。但是我没有看到你的例子有什么特别的错误。我曾多次写过类似的代码。

答案 1 :(得分:0)

由于派生类似乎没有添加任何状态或多态行为,因此切片似乎在功能上起作用。但我建议你还是不要这样做。

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

Base TinyFont(png, colors) { /* create and return item */ }
Base SmallFont(png, colors) { /* create and return item */ }