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中文网其他相关文章!