首页 > 后端开发 > C++ > 切片如何影响 C 中的多态性?

切片如何影响 C 中的多态性?

Linda Hamilton
发布: 2024-11-30 21:51:19
原创
436 人浏览过

How Does Slicing Affect Polymorphism in C  ?

C 中的多态性和切片

在 C 中,多态性允许您基于派生类创建具有不同功能的对象。但是,如果处理不当,可能会导致奇怪的行为。其中一个问题是“切片”。

考虑以下代码:

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void makeSound() { cout << "rawr" << endl; }
};

class Dog : public Animal {
public:
    virtual void makeSound() { cout << "bark" << endl; }
};

int main() {
    Animal animal;
    animal.makeSound();

    Dog dog;
    dog.makeSound();

    Animal badDog = Dog();
    badDog.makeSound();

    Animal* goodDog = new Dog();
    goodDog->makeSound();
}
登录后复制

您得到的输出是:

rawr
bark
rawr
bark
登录后复制

您可能期望输出为“rawr bark bark bark”,但对象 badDog 的行为是动物而不是狗。这是因为切片。

当您将 badDog 创建为 Animal badDog = Dog() 时,您正在将 Dog 对象切片为 Animal。这意味着 badDog 只包含 Dog 中属于 Animal 类的部分,并且所有特定的 Dog 功能都会丢失。

要解决此问题,您需要使用指针或引用来派生类。指针或引用不会复制对象,因此它们可以保留其特定功能。例如,goodDog 指针成功地保留了它的 Dog 功能。

一些语言(例如 Java)默认具有引用语义,而 C 使用值语义。在 C 中,您明确需要使用指针或引用来实现引用语义。如果不这样做可能会导致切片问题,如 badDog 示例所示。

以上是切片如何影响 C 中的多态性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板