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