> 백엔드 개발 > C++ > 슬라이싱은 C의 다형성 동작에 어떤 영향을 미칩니까?

슬라이싱은 C의 다형성 동작에 어떤 영향을 미칩니까?

Barbara Streisand
풀어 주다: 2024-12-04 02:14:14
원래의
691명이 탐색했습니다.

How Does Slicing Affect Polymorphic Behavior in C  ?

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

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