假设我有一个名为AudioSample的类,实现不相关。
AudioSamples可以从多个来源加载,对于每个来源,我都从AudioSample派生一个类,该类添加了相关来源的相关加载器代码。加载后,我故意将对象传递给按值使用AudioSample的函数,从而对其进行切片。

在我看来,这很好,它可以防止使用各种加载函数污染基类,并避免在必须添加新的加载器时不得不修改(经过尝试)的基类。

但是,当在stackoverflow上搜索对象切片时,我只能找到描述它为问题并解释其潜在缺陷的答案,这使我感到奇怪:我是否以一种我不应该使用的方式使用它?通过执行当前不知道的操作,是否会遇到潜在的问题?

最佳答案

对象切片本身并不是问题,因为它是定义明确的操作。只是它通常会引发一个“WTF”时刻,因为它很少是故意的。我对代码质量的偏爱是每分钟阅读WTF的倒数,因此从这个角度来看,这是个坏主意,因为它将需要大量文档来声明“是的,我真的知道我在做什么”。

因此,我将更倾向于将其限制在一个命名良好且用途明确的函数中。像这样的东西:

class AudioSampleLoadedViaFoo : public AudioSample
{
  // ...
public:
  AudioSample getLoadedSample() const
  {
    return *this; // Slice on purpose to remove load-specific stuff
  }
};

这样,在外部代码中使用将只看到定义良好的函数,而切片只是实现细节。

09-07 03:18