가상 기능이란 무엇입니까?
가상 함수는 수퍼 클래스에 정의 된 함수로, 해당 서브 클래스가 완전한 클래스 정의를 갖도록 서브 클래스에 있어야합니다. 가상 함수는 가상 상속이라는 객체 지향 프로그래밍 패러다임에 의존하며, 이는 "virtual"키워드를 사용하여 C ++에서 가장 일반적으로 볼 수 있습니다. 가상 함수를 정의하려면 수퍼 클래스와 서브 클래스의 두 클래스가 필요합니다. 수퍼 클래스는 함수가 처음 선언되고 정의 될 수있는 곳입니다. 서브 클래스는 함수가 수퍼 클래스에 정의되었는지 여부에 따라 함수가 정의되는 위치입니다.
가상 기능은 두 가지 방법 중 하나로 정의 할 수 있습니다. 먼저 스텁으로 정의 할 수 있습니다. 스텁은 비어있는 몸체를 가지고 있으며 아무것도하지 않습니다. 둘째, 순수 가상 함수로 정의 할 수 있으며, 수퍼 클래스 헤더 파일에서 NULL로 정의됩니다.
두 가지 방법 모두에 장단점이 있습니다. 함수를 스텁으로 정의하면 아무 것도 수행하지 않더라도 모든 서브 클래스가 일부 구현을 갖습니다. 그러나 함수를 재정의하고 하위 클래스에서 올바르게 구현하는 것을 잊어 버린 경우 오류 또는 경고가 나타나지 않습니다. 반면 순수 가상 함수를 정의하려면 각 서브 클래스에 고유 한 함수 정의가 있어야하며, 그렇지 않은 경우 오류가 나타납니다.
그러나 가상 함수에는 비가 상 함수와 동일한 상속 규칙이 적용되므로 레벨이 3보다 큰 상속 계층에는 가상 함수의 명시 적 정의가 필요하지 않을 수 있습니다. 예를 들어, 서브 클래스 B에 구현 된 가상 함수를 선언하는 클래스 A를 고려할 수 있습니다. 클래스 B에는 자체 클래스 C의 서브 클래스가 있습니다. 클래스 C는 클래스 A의 함수를 명시 적으로 정의 할 필요가 없습니다. 필요한 경우 클래스 C는 클래스 B의 함수를 대체하거나 클래스 B의 함수를 재정의 할 수 있습니다.
다른 극단적 인 경우, 가상 함수는 해당 서브 클래스에서 가상으로 선언 된 경우 서브 클래스에서 정의 할 필요가 없습니다. 예를 들어 가상 함수를 선언하고 B와 C라는 두 개의 서브 클래스가있는 클래스 A를 고려할 수 있습니다. 또한 클래스 B에 서브 클래스 D와 E가 있고 서브 클래스 C에 서브 클래스 F와 G가 있다고 상상할 수 있습니다.
클래스 B에서 G까지는 모두 클래스 A의 가상 기능이 어떻게 든 정의되어 있어야합니다. 클래스 B에 A의 기능이 구현되어 있으면 클래스 D와 E는 다시 실행할 필요가 없습니다. 아마도 C의 서브 클래스는 A의 함수를 구현해야하지만 둘 다 다른 것을 수행하므로 클래스 C 자체에서 함수를 정의하는 것은 도움이되지 않습니다. 이 경우, 함수는 클래스 C에서 가상으로 선언 될 수 있으며 구현이 필요하지 않습니다.
가상 함수는 배우기가 어려울 수 있지만 올바르게 사용하면 코드 중복을 줄이고 코드를 이해하기 쉽게 만들 수 있습니다. 그러나 가상 함수에는 여러 상속에 대한 함정이 많이 있습니다. 다중 상속에서는 모호하게 정의 된 가상 함수가 서로 충돌 할 수 있으므로 해당 컨텍스트에서주의해서 사용해야합니다.