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

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

Patricia Arquette
Patricia Arquette원래의
2024-12-02 05:20:09728검색

How Does Polymorphism and Slicing Affect Object 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

대신 "rawr barbarbark" 출력이 나올 것으로 예상할 수 있으므로 이는 놀라운 결과일 수 있습니다. . 차이점은 badDog 할당에서 슬라이싱을 사용한다는 점입니다.

Animal badDog = Dog();

이 경우 Dog의 데이터가 Animal 개체로 슬라이싱되어 Dog 관련 정보가 손실됩니다. Dog()가 Dog 객체를 생성하는데 Animal 객체인 badDog에 할당하면 Dog의 Animal 부분만 복사되기 때문입니다.

슬라이싱을 방지하려면 포인터나 포인터를 사용하면 됩니다. 참조:

Animal* badDogPtr = new Dog();
Animal& goodDogRef = dog;

포인터와 참조는 예상대로 작동하며 다형성 동작을 허용합니다. 이는 값 의미론의 경우처럼 객체의 복사본을 갖는 것이 아니라 객체에 대한 참조를 참조하거나 보유하기 때문입니다.

Java 및 C#과 같은 언어에서는 참조 의미론이 기본값이지만 C , 값 의미 체계가 기본값입니다. C의 다형성 동작을 위해서는 참조나 포인터를 명시적으로 사용해야 합니다.

위 내용은 다형성과 슬라이싱은 C의 객체 동작에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.