肖恩·帕特(Sean Parent):对于继承层次结构中的多态类型,具有可变对象是极端例外

CD8*_*D86 5 c++ polymorphism inheritance virtual-functions c++11

我想知道肖恩家长,其实就是 被这句话

对于继承层次结构中的多态类型,具有可变对象是极端例外...

他继续提到两个原因,但是我很难理解他的解释。

是什么让我无法在子类中提供实际上更改此对象内部结构的函数?

有人可以详细说明一下吗?

Jör*_*ann 0

回答

\n

研究了一个小时的视频后,我明白了他的意思。

\n

47:49 他开始说:

\n
\n

我们是否真的修改了这个对象及其内部结构?观察结果是,对于对象的多态用例(具有可变对象)来说,这是一种极端的例外,但这样做是有好处的。这是有充分理由的。因此,如果我有一个虚拟函数正在改变我的对象,那么可以吗?- 那么,我正在做的就是两件事之一。我要么说我的子类可以提供不同的实现,这是非常有问题的,因为这将改变该操作的性能保证,并可能改变我的对象上的一堆其他操作,或者我是说我的子类想要观察这个东西何时被设置,但他们实际上并没有改变它,所以我应该做的是提供一个观察者函数,当我改变东西时我会调用它们,而不是让它们覆盖我的变异虚拟函数...

\n
\n

他的意思是字面意思。

\n
\n

...有一个虚拟函数正在改变我的对象...

\n
\n

因此,他说你很少有像......这样的继承希拉奇。

\n
Animal\n+-Cat\n+-Dog\n| +-Doberman\n+-Bird\n
Run Code Online (Sandbox Code Playgroud)\n

...您想要使用具有不同实现的虚拟方法更改不同多态变体的状态(变异)。

\n

例如

\n
int main() {\n\n    Animal* apObject[] = { new Cat(), new Dog(), new Doberman() };\n\n    const   int cnAnimals = sizeof(apObject)/sizeof(Animal*);\n    for ( int i = 0; i < cnAnimals; i++ ) {\n        apObject[i]->Feed(1.3);\n    }\n    for ( int i = 0; i < cnAnimals; i++ ) {\n        delete apObject[i];\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所有动物都通过应用多态函数(“Feed”)获取食物,但不同的实现以不同的方式修改状态。

\n

他说这是极端的,极其罕见的!

\n

我的评论

\n

Sean Parent 在使用复制构造函数和赋值运算符复制多态对象时遇到了问题。如果对象是不可变的,他似乎提供了一个很好的解决方案。

\n

然而,我认为肖恩父母的说法“对象的多态用例 - 具有可变对象 - 是极端的例外”是错误的

\n

背景:\n为什么 C++ 中需要虚函数?

\n

引用《呆伯特原理》:

\n
\n

工程师识别指南

\n

自我评估

\n

你走进一个房间,发现一幅画歪歪扭扭地挂着。

\n

你...

\n

:把它拉直。

\n

:忽略它。

\n

C : 购买 CAD 系统\n并在接下来的六个月里设计一个太阳能驱动的、\n自动调节的相框\n同时经常大声说出\n你的信念\n
钉子的发明者\n是个彻头彻尾的白痴

\n

正确答案是 \xe2\x80\x9cC\xe2\x80\x9d 但可以将部分功劳给予任何写 \xe2\x80\x9c 的人,这取决于测试边缘的 \xe2\x80\x9d 或简单地归咎于整个\xe2\x80\x9cMarketing 上的愚蠢事情。\xe2\x80\x9d

\n
\n

他的视频中有更多的言论,我不同意——出于同样的原因。

\n