> 백엔드 개발 > C++ > C에서 파생 클래스에 대한 캐스팅이 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?

C에서 파생 클래스에 대한 캐스팅이 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-29 09:27:11
원래의
747명이 탐색했습니다.

Why Does Casting Base to Derived Classes in C   Often Fail, and What are the Better Alternatives?

C에서 파생 클래스로 캐스팅

질문은 기본 유형 개체를 파생 유형으로 캐스팅할 수 없는 것과 관련이 있습니다. 제공된 접근 방식은 유효한 생성자가 없거나 모호한 생성자 확인으로 인해 오류가 발생합니다.

여기서 상속 개념을 이해하는 것이 중요합니다. 동물 계층 구조를 생각해 보세요.

class Animal { /* Some virtual members */ };
class Dog: public Animal {};
class Cat: public Animal {};
로그인 후 복사

모든 동물은 본질적으로 기본 유형 범주에 속하기 때문에 기본 유형 객체(예: Animal)를 파생 유형 변수(예: Dog)에 할당하면 캐스팅 없이 작동합니다. 그러나 동적 캐스팅을 사용하지 않고 파생 유형 객체를 기본 유형 객체(예: Dog to Animal)로 다시 캐스팅하려고 하면 슬라이싱이 발생하고 파생 유형별 데이터가 손실됩니다.

동적 캐스팅은 안전한 캐스팅 방법을 제공합니다. 파생 유형 객체는 객체가 다형적으로 저장되는 기본 유형 컨테이너로 다시 돌아갑니다.

std::vector<Animal*> barnYard;
barnYard.push_back(&dog);
barnYard.push_back(&cat);
barnYard.push_back(&duck);
barnYard.push_back(&chicken);

Dog* dog = dynamic_cast<Dog*>(barnYard[1]); // Note: NULL as this was the cat.
로그인 후 복사

그러나 동적 캐스팅을 사용하면 디자인 결함이 있는 경우가 많습니다. 대신 가상 메서드를 사용하여 속성에 동적으로 액세스하는 것을 고려해 보세요.

void makeNoise(Animal& animal) { animal.DoNoiseMake(); }
Dog dog;
Cat cat;
Duck duck;
Chicken chicken;

makeNoise(dog);
makeNoise(cat);
makeNoise(duck);
makeNoise(chicken);
로그인 후 복사

위 내용은 C에서 파생 클래스에 대한 캐스팅이 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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