나는 유형이 일 때 자동으로가 의 가장 깊은 부분 인으로 해결 될 것이라고 생각했습니다. Cat
클래스 Animal
에서 talk()
을 무시하는 경우 Cat : Animal
는 당신이, cat->talk()
를 호출 할 경우, 고양이는 "야옹"이 아니라 몇 가지 이상한 일반 Animal
가 기본 클래스 Animal
에서 제공 불평 말할 것이다. 여기 상속 해상도
struct Animal
{
virtual void talkTo(Animal* o) {
puts("Animal-Animal") ;
}
} ;
struct Cat : public Animal
{
virtual void talkTo(Animal* o) {
puts("Cat-Animal") ;
}
virtual void talkTo(Cat* o) {
puts("Cat says meow to Cat") ;
}
} ;
일부 호출 코드입니다 :
그래서 나는 이것에 대해 혼란 스러워요 여기
Cat *cat = new Cat() ;
cat->talkTo(cat) ; //Cat says meow to Cat
Animal *animalCatPtr = cat ;
cat->talkTo(animalCatPtr) ; //Cat-Animal
마지막 줄, 나는 Cat
cat->talkTo
에 보내하지만 난 animalCatPtr
을 사용하고 있습니다 . animalCatPtr
은 여전히 Cat
을 참조하지만 아직까지는 함수 호출에서 단순히 Animal
으로 해석됩니다.
통과 포인터가 실제로 계층 구조에서 가장 깊은 유형으로 확인되도록하려면? 나는 dynamic_cast<>
일련의 테스트를하고 싶지 않다. Animal
이 실제로 있는지 알고 싶습니다. Cat
또는 Dog
또는 무엇을 가지고 있습니다.
'void (Animal *)'멤버 함수 만 오버라이드됩니다. 다른 하나는'Cat'에서만 정의 된 * 새로운 * 오버로드입니다. –