> 백엔드 개발 > C++ > C 다형성에서 슬라이싱이 발생하는 이유는 무엇이며 어떻게 피할 수 있습니까?

C 다형성에서 슬라이싱이 발생하는 이유는 무엇이며 어떻게 피할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-11-28 05:35:22
원래의
904명이 탐색했습니다.

Why Does Slicing Occur in C   Polymorphism, and How Can It Be Avoided?

C의 다형성과 슬라이싱: 혼란의 디코딩

C에서 다형성을 통해 기본 클래스에서 파생된 개체가 다른 동작을 나타낼 수 있습니다. 그러나 "슬라이싱"이라고 알려진 일반적인 함정은 예상치 못한 결과를 초래할 수 있습니다.

질문:

다음 코드 조각을 고려하세요.

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

class Dog : public Animal {
    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는 "bark"를 인쇄하지 않습니까?

답변:

슬라이싱의 예입니다. Dog 객체를 Animal 생성자에 전달하면(예: badDog = Dog()) Dog의 Animal 부분이 badDog에 복사됩니다. 그러나 badDog는 Animal 유형이므로 기본적으로 "rawr"을 인쇄하는 Animal 메서드에만 액세스할 수 있습니다.

다형성을 달성하려면 파생 클래스 개체를 가리키는 포인터나 참조를 사용해야 합니다. 이 경우 goodDog는 Dog 개체에 대한 포인터이므로 Dog 메서드에 액세스하여 "bark"를 인쇄할 수 있습니다.

의미:

슬라이싱으로 인해 다음이 발생할 수 있습니다. 예상치 못한 행동이 발생하므로 일반적으로 권장되지 않습니다. 포인터나 참조를 사용하면 적절한 다형성 동작이 보장됩니다.

또한 C는 기본적으로 값 의미 체계를 사용하므로 변수에 실제 개체가 포함된다는 점을 기억하세요. 이는 변수가 객체에 대한 참조를 보유하는 Java 및 C#과 같은 언어의 참조 의미 체계와 다릅니다.

위 내용은 C 다형성에서 슬라이싱이 발생하는 이유는 무엇이며 어떻게 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿