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"가 출력됩니다. 그 이유는 슬라이싱 때문입니다. "badDog"가 "Dog" 개체로 초기화되면 "Dog" 개체의 "동물" 부분만 "badDog"에 복사됩니다. 따라서 "badDog"는 "동물"로 남아 있으며 "개" 동작에 액세스할 수 없습니다.
C에서는 값 기반 복사가 참조를 초기화하는 Java 또는 C#과 같은 언어와 달리 값 의미 체계가 적용됩니다. 클래스 객체를 복사하면 자체 할당된 메모리가 있는 객체의 별도 복사본이 생성되어 슬라이싱이 발생합니다. 다형성 동작을 달성하려면 한 유형의 객체를 다른 객체에 직접 할당하는 대신 C에서 포인터나 참조를 사용해야 합니다.
위 내용은 슬라이싱은 C의 다형성 동작에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!