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