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 중국어 웹사이트의 기타 관련 기사를 참조하세요!