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

问题描述 投票:0回答:1

我想知道肖恩·帕伦特到底是什么意思 以此声明

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

他接着提到了两个原因,但我很难理解他的解释。

是什么阻止我在子类中提供一个实际上改变这个对象内部的函数?

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

c++ c++11 inheritance polymorphism virtual-functions
1个回答
0
投票

回答

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

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”,但任何在测试空白处写下“这取决于”或简单地将整个愚蠢的事情归咎于“营销”的人都可以得到部分分数。

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.