가상 기능이란 무엇입니까?
가상 함수는 슈퍼 클래스로 정의 된 함수이며, 해당 서브 클래스가 완전한 클래스 정의를 갖기 위해 서브 클래스로 존재해야합니다. 가상 함수는 "Virtual"키워드를 사용하여 C ++에서 가장 일반적으로 볼 수있는 가상 상속이라는 객체 지향 프로그래밍 패러다임에 의존합니다. 가상 함수를 정의하기 위해서는 슈퍼 클래스와 서브 클래스라는 두 개의 클래스가 필요합니다. 슈퍼 클래스는 함수가 처음 선언되어 정의 될 수있는 곳입니다. 서브 클래스는 함수가 슈퍼 클래스에 정의되었는지 여부에 따라 함수가 정의되거나 재정의되는 위치입니다.
가상 함수는 두 가지 방법 중 하나로 정의 될 수 있습니다. 첫째, 그것은 스터브로 정의 될 수 있으며, 여기서 빈 몸체가 있고 아무것도하지 않습니다. 둘째, 순수한 가상 함수로 정의 될 수 있으며, 여기서 슈퍼 클래스의 헤더 파일에서 null로 정의됩니다.
두 방법론에 장점과 단점이 있습니다. 기능을 스터브로 정의하면 모든 서브 클래스가아무것도하지 않더라도 일부 구현. 그러나 기능을 무시하고 서브 클래스로 올바르게 구현하는 것을 잊어 버리면 오류 나 경고가이를 지적하는 것으로 보이지 않습니다. 반면에 순수한 가상 함수를 정의하려면 각 서브 클래스는 기능에 대한 자체 정의를 가져야하며, 그렇지 않은 경우 오류가 나타납니다.
그러나가상 함수는 비 주행 함수와 동일한 상속 규칙을 따릅니다. 따라서 2 단계 이상의 상속 계층은 가상 함수에 대한 명시적인 정의가 필요하지 않을 수 있습니다. 예를 들어, 서브 클래스 B에서 구현되는 가상 함수를 선언하는 클래스 A를 고려할 수 있습니다. 서브 클래스 B 클래스 B 클래스 C 클래스 C 클래스 C는 클래스 B의 정의를 상속 받기 때문에 클래스 A 기능의 명시 적 정의가 필요하지 않습니다. 필요한 경우 클래스 C는 클래스 B의 기능을 무시할 수 있습니다.또는 클래스 B 기능을 무시할 수 있습니다.
다른 극단에서는 가상 함수가 해당 하위 클래스에서 가상으로 선언 된 경우 서브 클래스로 정의 할 필요가 없습니다. 예를 들어, 가상 함수를 선언하고 두 개의 서브 클래스 B와 C를 갖는 클래스 A를 고려할 수 있습니다. 또한 클래스 B에 서브 클래스 d와 e가 있고 서브 클래스 c는 서브 클래스 f 및 G를 가지고 있다고 상상할 수 있습니다.
.클래스 B에서 G ~ G는 모두 클래스 A의 가상 함수가 어떻게 든 정의되어 있어야합니다. 클래스 B에 A의 기능이 구현되면 클래스 D와 E는 다시 작성할 필요가 없습니다. 아마도 C의 서브 클래스는 A의 기능을 구현해야하지만 둘 다 다른 것을 수행하므로 클래스 C 자체의 기능을 정의하는 것은 유용하지 않습니다. 이 경우 기능은 클래스 C에서 가상으로 선언 될 수 있으며 구현이 필요하지 않습니다.
가상 함수는 배우기가 어려울 수 있지만 제대로 사용하면 코드 복제를 줄이고 코드를 훨씬 쉽게 이해할 수 있습니다.일반적으로. 그러나 가상 함수, 특히 여러 상속에 관한 많은 함정이 있습니다. 다중 상속에서는 모호하게 정의 된 가상 함수가 서로 충돌 할 수 있으므로 해당 맥락에서주의해서 사용해야합니다.