通过值将子类对象传递给采用超类对象的函数是否是明确定义的行为?

mer*_*011 10 c++ inheritance

我已经看过这里这里有关这个主题的相关问题,它们都描述了对象切片,但它们都没有说明它是否安全,可靠可预测.

有没有从任何标准或编译器的保证,如果我传递一个子类对象的值到想要一个超类的方法,被切掉的部分是完全相同的子类的成员,我将能够使用切片的超类对象没有任何关于未定义行为的顾虑?

cma*_*ter 6

是的,它是安全,可靠和可预测的,因为它由标准很好地定义(它只是从派生类对象复制构造基类对象).

但不,它不安全,不应该依赖,并且通常被视为不可预测,因为你的读者不会知道发生了什么.当其他人稍后尝试修改您的代码(包括您自己的未来自我)时,这将触发大量错误.它基本上是一个禁忌,与goto声明的方式非常相似,它的定义非常明确,可靠且可预测.

  • @CaptainObvlious嗯,阅读文本的其余部分,你会很清楚...... (3认同)
  • _"是的,这是安全的"_!= _"不,它不安全"_.那是哪一个呢? (2认同)