C ++ 및 Delphi의 기능 오버라이드 및 오버로드
스페이스 소프트 night 다크 나이트 샌드】
객체 지향 프로그래밍에서 서브 클래스가 기본 클래스에서 함수를 계속하면 서브 클래스는 다음과 같은 기본 클래스와 다르게 일부 함수를 처리해야 할 수 있습니다.
클래스 chuman
{
공공의:
void saymyname () // 객체의 이름을 인쇄합니다
{
cout << 안녕하세요, 나는 인간입니다 << endl;
}
};
그러면 서브 클래스가 동일한 이름, 동일한 매개 변수 및 반환 값 (한 문장, 동일한 함수)의 함수 SayMyname이 있으면 어떤 함수가 호출됩니까? 예를 들어, 지금 클래스 Cmark가 있습니다
클래스 Cmark : 공개 Chuman
{
공공의:
void saymyname ()
{
cout << 안녕하세요, 나는 mark << endl입니다.
}
};
그런 다음 다음 프로그램 세그먼트를 물어봐야합니다.
Chuman *pH = 새로운 Cmark;
if (ph)
ph-> saymyname ();
또 다른
cout << 캐스트 오류! << endl;
pH 삭제;
pH = null;
인쇄하고 싶은 마크입니까?
아니요. 그것은 인간입니다. 그것은 끔찍하고, 우리가 사람을 가리키고 그에게 그의 이름을 말하도록 요청할 때, 그는 우리에게 그의 이름을 말하는 대신 "사람"이라고 말합니다. 이 문제의 이유는 기본 클래스 포인터를 사용하여 공개 파생 클래스를 가리키면 기본 클래스에서 계속되는 파생 클래스의 멤버 기능에 액세스 할 수 있기 때문입니다. 그러나 파생 클래스에 동일한 이름을 가진 기능이있는 경우 결과는 파생 클래스 자체의 기능보다는 기본 클래스의 동일한 이름의 기능에 여전히 액세스됩니다. 실제로, 우리가 원하는 것은 실제 유형의 객체에 의해 동일한 이름의 이러한 기능 중 어느 기능을 호출 해야하는지 결정하는 것입니다. 즉, 그러한 해상도는 역동적입니다. 또는 객체가 하위 유형 일 때 하위 클래스에서 동일한 이름의 구현이 기본 클래스의 구현을 무시한다고 말할 수 있습니다.
C ++ 의이 문제를 처리하는 것으로 시작하겠습니다.
이것은 C ++에서 다형성의 전형적인 예입니다. 구체적으로, 가상 핵심 단어를 사용하여 기능을 가상 함수로 설명하는 것이 다음과 같이 선언되어야합니다.
클래스 chuman
{
공공의:
virtual void saymyname () // 객체 이름을 인쇄합니다
{
cout << 안녕하세요, 나는 인간입니다 << endl;
}
};
이런 식으로 다른 코드는 여전히 동일하지만 CMARK는 이미 그 이름을 말하는 방법을 알고 있습니다. Cmark의 saymyname () 함수가 가상 키워드를 추가했는지 여부는 중요하지 않습니다. C ++ 구문의 조항에 따르면 같은 이름의 Chuman 함수를 무시하기 때문에 가상 자체가되기 때문입니다. 가상 키 단어가 왜 그렇게 마법의 영향을 미치는가? C ++ FAQ Lite는 이것을 다음과 같이 설명합니다. C ++에서 "가상 멤버 기능은 동적으로 결정됩니다 (런타임). 포인터 유형/해당 객체에 대한 참조 ". 따라서 우리의 pH는 실제로 자체 유형으로 선언 한 Chuman이 아니라 CMARK의 SayMyname이라고 부릅니다.
Delphi는 핵심 단어 위반을 사용하여 기능 오버라이드를 설명합니다. 덮어 쓰기 함수는 가상 또는 동적이어야합니다. 즉, 함수는 다음과 같이 선언 할 때이 두 지표 중 하나를 포함해야합니다.
프로 시저 드로우; 가상;
재정의가 필요하면 하위 클래스의 Override 표시기를 사용하여 다시 클레어를 사용하면됩니다.
프로 시저 드로우;
구문 적으로, 가상 및 동적 선언은 동일합니다. 차이점은 전자가 구현 속도를 최적화하는 반면 후자는 코드 크기를 최적화한다는 것입니다.
기본 클래스와 서브 클래스에 동일한 함수 이름과 매개 변수가 모두 포함되어 있고 오버라이드 표시기가 서브 클래스에 추가되지 않으면 어떻게해야합니까? 이것은 또한 구문 적으로 정확합니다. 이는 서브 클래스 기능의 기능 구현이 파생 클래스에 존재하지만 기본 클래스의 구현을 숨 깁니다. 그런 다음이 기사의 시작 부분의 첫 번째 예에서 보여지는 상황으로 돌아가 봅시다. 이름.
델파이에서는 과부하 기능과 오버로드 함수와 달리, 델파이에서는 과부하 만있는 것만으로도 과부하 된 기능이 여전히 존재하며 매개 변수는 어떤 구현이 호출되는지를 결정합니다. 물론, 기능이 삭제 된 오버로드가 기본 클래스의 함수 매개 변수와 동일 할 때, 기본 클래스의 구현은 위에서 언급 한 것과 마찬가지로 숨겨져 있습니다. 오버라이드는 덮어 쓰기 기능을 보이지 않고 실제로 덮어 쓰는 것을 의미하며 원래 구현이 사라집니다. 이러한 이유로, 많은 기사와 일부 책조차도 실수로 과부하로 재정의되어 적절하지 않다고 생각합니다.