다형성과 가상 함수
다형성은 C++의 중요한 기능 중 하나이자, 초보자가 이해하기 어려운 기능이기도 합니다. 먼저 간단한 예를 살펴보겠습니다.
코드는 매우 간단합니다. 작성자의 말에 따르면 위 코드에서 다형성의 기능에 대한 핵심 사항을 설명하면 안 됩니다. 더 간단하게, 주 함수부터 시작합니다:
기본 클래스에 대한 포인터
이 세 가지 사항은 필수 조건이며 하나는 필수입니다.
위 코드에는 다른 흥미로운 내용이 있습니다. 결과에 영향을 미치지는 않지만 그래도 이해하는 것이 좋습니다. 파생 클래스에서 기본 클래스의 가상 함수를 재정의(오버라이딩)하는 경우:
virtual 키워드가 필요하지 않습니다
실패 덮기
가상 함수를 덮어쓰려면 두 함수의 서명이 일관되어야 합니다. 예를 들어, 다음 코드는
sub2::f1의 서명이 base::f1의 서명과 일치하지 않으므로 다형성을 달성할 수 없습니다.
어쩌면 이 오류가 너무 명백하고 절대 발생하지 않을 것이라고 생각할 수도 있습니다. 이는 이 예제의 멤버 함수가 너무 단순하기 때문입니다. 실제 개발에서는 개발 규모가 확장됨에 따라 클래스의 상속 관계가 점점 더 깊어지고 멤버 함수의 매개 변수도 점점 더 많아질 것입니다. 파생 클래스에 정의된 멤버 함수의 서명 및 재정의를 자주 접하게 됩니다. 개체의 서명이 일치하지 않아 덮어쓰기가 실패합니다.
그리고 끔찍한 점은 이러한 종류의 오류는 컴파일 오류를 생성하지 않으며 찾기가 쉽지 않다는 것입니다.
override 지정자
이 문제를 해결하기 위해 C++11에 메서드가 도입되었습니다. 파생 클래스에서 재정의 함수를 선언하고 정의할 때 재정의 지정자를 사용하세요.
명시적인 함수 의도로 인해 이므로 컴파일러가 기본 클래스에서 동일한 시그니처를 가진 가상 함수를 찾을 수 없으면 컴파일 오류가 발생합니다.
저자는
언어 자체의 기능을 더 잘 활용하고 오류를 자동으로 감지할 수 있는 기회를 포기하지 않는 것이 C++ 프로그래머의 습관이 되어야 한다고 생각합니다. 장인 정신의 구현이라고도 볼 수 있습니다.
관련 기사:
C++11의 새로운 기능에서 auto와 decltype의 차이점과 연결
관련 동영상:
위 내용은 C++11의 새로운 기능 - 다형성 및 가상 함수, 재정의 지정자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!