理解 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”。这是因为切片。当用“Dog”对象初始化“badDog”时,只有“Dog”对象的“Animal”部分被复制到“badDog”。因此,“badDog”仍然是“动物”,无法访问“狗”行为。
在 C 中,与 Java 或 C# 等基于值的复制初始化引用的语言不同,应用值语义。复制类对象会使用自己分配的内存创建该对象的单独副本,从而导致切片。为了实现多态行为,C 中应该使用指针或引用,而不是直接将一种类型的对象分配给另一种类型的对象。
以上是切片如何影响 C 中的多态行为?的详细内容。更多信息请关注PHP中文网其他相关文章!