분석 함수와virtual

2150 단어 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의 분석 함수를 호출하는 것이 아니다.출력:
    ~A();  
 
A의 분석 함수가 virtual이면 먼저 ~ B (), 그리고 ~ A () 로 출력됩니다.
    ~B();
    ~A();
 
클래스가 파생될 경우 분석 함수는 일반적으로virtual로 정의해야 하는데 주로 메모리 유출을 방지하는 것이 아니라 정확한 분석을 위한 것이다.폐쇄류 (즉 파생되지 않음) 라면 가상 클래스로 정의하지 마십시오.허함수는 결국 소모가 비교적 크다.
 
 
가상 기능을 사용하지 않는 경우:
  • 는 비공유 기류로 한다.private base class로만 사용되는class는 가상 분석 함수를 사용할 필요가 없습니다.
  • 인터페이스로 사용되지 않는 기류.  
  • 이 클래스가 퍼블릭 계승되지 않도록 보장할 수 있다면(private/protected 계승이 아니라면 비friend 함수/클래스에서는 기본 클래스 바늘로 파생 클래스를 가리킬 수 없습니다)
  • 만약에 그의 모든 파생류(파생류를 포함한 파생류)의 분석 함수가 trivial이라면 (이곳의 trivial은 프로그래머의 차원에서 아무 일도 하지 않는 것을 가리킨다)
  • 기본 클래스의 지침으로 파생 클래스의 대상을 가리키지 않아도 된다
  • 이 다섯 가지 상황에서 분석 함수를virtual이라고 성명하지 않아도 된다. 하물며 효율이 좀 높을 것이다. 그러나 전제는 전제의 성립을 보장해야 한다. 그러나 이런 보증은 항상 100%가 어렵다. 누가 다른 사람이 당신의 종류를 파생시킬 때 분석 함수가trivial이거나 다른 사람이 당신이 제공한 기류의 지침을 사용하지 않고 파생류의 대상을 가리킬 수 있겠는가?이런 것들은 종종 보증을 얻기 어렵다. 
     
    성명 기류의 분석 함수가virtual인 것은 항상memory leak을 방지하기 위한 것이 아니다. 또한 이것은 일반적인 원칙일 뿐이다. (기류에 허함수가 있으면 그 분석 함수를virtual로 성명한다.)만약 당신의 분석 함수가 아무 일도 하지 않는다면, 효과적으로virtual이라고 성명하지 않아도 무방하다.
     
     
    왜 내연 함수, 구조 함수, 정적 구성원 함수는virtual 함수일 수 없습니까?
     
    (1) 내연 함수
     
    내연 함수는 컴파일링 시기에 전개되고 허함수의 특성은 운행할 때만 동적 컴파일링되기 때문에 양자가 모순되어 내연 함수를 허함수로 정의할 수 없다.
     
    (2) 구조 함수
     
    구조 함수는 새로운 대상을 만드는 데 사용되며, 허함수의 운행은 대상을 바탕으로 이루어진다.구조 함수를 집행할 때 대상이 아직 형성되지 않았기 때문에 구조 함수를 허함수로 정의할 수 없다.
     
    (3) 정적 구성원 함수
     
    정적 구성원 함수는 하나의 클래스에 속하며,this지침이 없으면 대상의 판별을 할 수 없습니다.

    좋은 웹페이지 즐겨찾기