분석 함수virtual과 비virtual의 차이

2317 단어 virtual
일반적인 원칙으로, 만약 하나의 클래스가 허함수를 정의한다면, 그 분석 함수는virtual이어야 한다.허함수를 정의하면 이 클래스는 계승되고 기본 클래스의 바늘을 통해 하위 클래스의 대상을 가리키며 다태성을 얻을 수 있기 때문이다.이 클래스는 계승될 수 있고, 기본 클래스의 바늘을 통해 하위 클래스의 대상을 가리킬 수 있습니다. 따라서 기본 클래스의 분석 함수가 허인지 여부는 하위 클래스의 대상이 분석될지 여부를 결정합니다.
코드 예:
#include <iostream.h>

struct A
{
    virtual ~A() {cout<<"~A()
";} }; struct B: public A { ~B() {cout<<"~B()
";} }; void main() { A* p = new B; delete p; }

 
만약 A의 분석 함수가virtual이 아니라면, 이때는 B의 분석 함수를 먼저 호출한 다음에 A의 분석 함수를 호출하는 것이 아니다. Output:~A();A의 분석 함수가virtual이면 먼저 ~ B (), 그리고 ~ A () Output: ~ B ()A();클래스가 파생될 경우 분석 함수는 일반적으로virtual로 정의해야 하는데 주로 메모리 유출을 방지하는 것이 아니라 정확한 분석을 위한 것이다.폐쇄류 (즉 파생되지 않음) 라면 가상 클래스로 정의하지 마십시오.허함수는 결국 소모가 비교적 크다.
virtual을 사용하지 않는 몇 가지 상황: 1. 비공유 기류로서.private base class로만 사용되는class는 가상 분석 함수 2를 사용할 필요가 없고 인터페이스로 사용되지 않는 기본 클래스입니다.     3.만약 이 클래스가 퍼블릭 계승되지 않도록 보장할 수 있다면 (private/protected 계승) 4.만약 그의 모든 파생류(파생류를 포함한 파생류)의 분석 함수가 trivial이라면 (이곳의 trivial은 프로그래머의 차원에서 아무 일도 하지 않는 것을 가리킨다)만약에 기류의 지침으로 파생류의 대상을 가리킬 필요가 없다면 이 다섯 가지 상황에서 분석 함수를virtual이라고 성명하지 않아도 된다. 하물며 효율이 좀 높을 것이다. 그러나 전제는 전제의 성립을 보증해야 한다. 그러나 이런 보증은 항상 100% 어렵다. 누가 다른 사람이 당신의 종류를 파생시킬 때 분석 함수는trivial이다.아니면 다른 사람이 당신이 제공한 기류의 지침을 사용하지 않고 파생류의 대상을 가리키나요?이런 것들은 종종 보증을 얻기 어렵다.  
성명 기류의 분석 함수가virtual인 것은 항상memory leak을 방지하기 위한 것이 아니다. 또한 이것은 일반적인 원칙일 뿐이다. (기류에 허함수가 있으면 그 분석 함수를virtual로 성명한다.)만약 당신의 분석 함수가 아무 일도 하지 않는다면, 효과상으로는 가상 함수라고 성명하지 않아도 무방하다.

좋은 웹페이지 즐겨찾기