我想知道肖恩·帕伦特到底是什么意思 以此声明
对于继承层次结构中的多态类型,拥有可变对象是极端的例外......
他接着提到了两个原因,但我很难理解他的解释。
是什么阻止我在子类中提供一个实际上改变这个对象内部的函数?
有人可以详细说明一下吗?
研究了一个小时的视频后 - 我明白了他的意思。
47:49 他开始说:
我们真的修改了这个对象及其内部结构吗?观察结果是,对于对象的多态用例 - 具有可变对象 - 是极端非常的例外,但这样做有好处。这是有充分理由的。因此,如果我有一个虚拟函数来mutating我的对象 - 可以吗? - 那么,我正在做的就是两件事之一。我要么说我的子类可以提供不同的实现,这是非常有问题的,因为这将改变该操作的性能保证,并可能改变我的对象上的一堆其他操作,要么我说我的子类想要观察这个东西何时被设置,但他们实际上并没有改变它,所以我应该做的是提供一个观察者函数,当我改变东西时我会调用它们,而不是让它们覆盖我的改变虚拟函数......
他是字面意思。
...有一个虚函数,它正在改变我的对象...
因此,他说你很少有像......这样的继承希拉希
Animal
+-Cat
+-Dog
| +-Doberman
+-Bird
...您想要使用具有不同实现的虚拟方法更改不同多态变体的状态(变异)。
例如
int main() {
Animal* apObject[] = { new Cat(), new Dog(), new Doberman() };
const int cnAnimals = sizeof(apObject)/sizeof(Animal*);
for ( int i = 0; i < cnAnimals; i++ ) {
apObject[i]->Feed(1.3);
}
for ( int i = 0; i < cnAnimals; i++ ) {
delete apObject[i];
}
return 0;
}
所有动物都通过应用多态函数(“Feed”)获取食物,但不同的实现以不同的方式修改状态。
他说这是极端的,极端的很少!
Sean Parent 在使用复制构造函数和赋值运算符复制多态对象时遇到了问题。如果对象是不可变的,他似乎提供了一个很好的解决方案。
但是,我认为 Sean Parent 的声明“对象的多态用例 - 具有可变对象 - 是极端的例外”是错误的。
背景: 为什么C++中需要虚函数?
引自《呆伯特原理》:
工程师识别指南
自我评估
您走进一个房间,发现一幅画歪歪扭扭地挂着。
你...
A:拉直它。
B:忽略它。
C:购买 CAD 系统 并在接下来的六个月里设计一个太阳能供电的 自动调节相框 当经常大声说出 你的信念
钉子的发明者是个白痴。正确答案是“C”,但任何在测试空白处写下“这取决于”或简单地将整个愚蠢的事情归咎于“营销”的人都可以得到部分分数。
他的视频中有更多的言论,我不同意 - 出于同样的原因。