>백엔드 개발 >C#.Net 튜토리얼 >C++ 가상 멤버 함수 및 동적 바인딩에 대한 자세한 설명

C++ 가상 멤버 함수 및 동적 바인딩에 대한 자세한 설명

hzc
hzc앞으로
2020-07-01 15:33:062099검색

추천 학습: "c++ Tutorial"

- 컴파일러는 비가상 메서드에는 정적 바인딩(컴파일 타임 일치)을 사용하고 가상 메서드에는 동적 바인딩(런타임 일치)을 사용합니다.

  • 가상 메서드를 사용하지 않는 경우 포인터 유형은 컴파일 타임에 알려지므로 컴파일러는 컴파일 타임에 멤버 메서드를 해당 클래스에 연결할 수 있습니다. 이를 정적 바인딩이라고 합니다. , 객체 유형은 일반적으로 프로그램이 실행될 때만 결정될 수 있으므로 컴파일러에 의해 생성된 코드는 프로그램이 실행될 때 멤버 함수를 해당 클래스에 연결합니다.
  •  정적 바인딩이 동적 바인딩보다 더 효율적입니다.

  가상 기능의 작동 방식.

 가상 기능.

 멤버 함수를 재정의합니다(함수 특성 변경).

 오버로드된 멤버 함수를 재정의합니다.

효율성

프로그램이 런타임 단계에서 결정을 내리려면 기본 클래스 포인터 또는 참조가 가리키는 개체 유형을 추적하는 몇 가지 방법을 사용해야 하며 이로 인해 처리 오버헤드가 추가됩니다. 따라서 다음 상황이 정적 바인딩에 더 적합합니다.

클래스는 기본 클래스로 사용되지 않습니다.

  • 파생 클래스는 기본 클래스의 어떤 메서드도 재정의하지 않습니다.
  • 따라서 정적 바인딩은 C++ 선택의 기본값으로 설정됩니다.

파생 클래스에서 기본 클래스 메서드를 재정의하려면 가상 메서드로 설정하고, 그렇지 않으면 비가상 메서드로 설정하세요.

가상 함수 작동 방식

컴파일러가 가상 함수를 처리하는 방식은 각 개체에 숨겨진 멤버를 추가하는 것입니다. 숨겨진 멤버는 함수 주소 배열에 대한 포인터를 저장합니다. 이 배열을 vtbl(가상 함수 테이블)이라고 하며 클래스 개체에 대해 선언된 가상 함수의 주소를 저장합니다.

파생 클래스 개체에는 독립 주소 테이블에 대한 포인터가 포함됩니다(즉, 새 테이블이 생성됨). (메모리 오버헤드 증가)

가상 함수가 호출되면 프로그램은 객체에 저장된 vtbl 주소를 살펴본 다음 해당 함수 주소 테이블로 가서 테이블의 주소를 찾습니다. (실행 속도에 영향을 줌)

간단히 말해서, 가상 함수를 사용하면 메모리와 실행 속도에 있어 특정 비용이 발생합니다. 비록 비함수가 가상 함수보다 약간 더 효율적이더라도 동적 바인딩 기능은 없습니다.

생성자는 가상 함수일 수 없습니다.

클래스가 기본 클래스일 필요가 없는 한 소멸자는 가상 함수여야 합니다.

친구는 ​​클래스 멤버가 아니고 멤버만 가상 함수가 될 수 있으므로 친구 함수는 가상 함수가 될 수 없습니다.

파생 클래스가 함수를 재정의하지 않으면 함수의 기본 클래스 버전이 사용됩니다(상속됨). 파생 클래스가 파생 체인에 있는 경우 기본 클래스 버전이 숨겨지지 않는 한 최신 가상 함수 버전(포인터 또는 참조 호출)이 사용됩니다.

재정의하면 기본 클래스 메서드가 숨겨집니다.

class Dwelling
{public:    virtual void showperks(int a) const;
    ...
};class Hovel : public Dwelling
{public:    virtual void showperks() const;
    ...
}

파생 클래스에서 함수를 재정의하면(매개변수 서명 변경) 기본 클래스 메서드를 오버로드하는 대신 동일한 이름의 기본 클래스 메서드가 숨겨집니다.

Hovel trump;
trump.showperks();    // validtrump.showperks(5);    // invalid

상속된 메서드를 재정의하는 경우 원본 프로토타입과 정확히 동일한지 확인해야 합니다. 반환 유형이 기본 클래스 참조 또는 포인터인 경우 파생 클래스에 대한 참조 또는 포인터로 수정될 수 있습니다(반환 유형 공분산: 즉, 클래스 유형이 변경됨에 따라 반환 유형도 변경될 수 있음).

기본 클래스 선언이 오버로드되면 파생 클래스에서 모든 기본 클래스 버전을 다시 정의해야 합니다. 하나의 버전만 정의되면 다른 버전은 숨겨지고 파생 클래스 개체는 이를 사용할 수 없습니다.

class Dwelling
{public:    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
    ...
};class Hovel : public Dwelling
{    virtual void showperks(int a) const;    virtual void showperks(double x) const;    virtual void showperks() const;
    ...
};

수정이 필요하지 않은 경우 새 정의는 기본 클래스 버전만 호출할 수 있습니다.

<span class="cnblogs_code"><span style="color: #0000ff;">void </span> Hovel ::showperks()<span style="color: #0000ff;">const</span></span>

{Dwelling::showperks();}

 <span class="cnblogs_code"><span style="color: #0000ff;">void</span> Hovel::showperks()<span style="color: #0000ff;">const</span> {Dwelling::showperks();}</span> 

위 내용은 C++ 가상 멤버 함수 및 동적 바인딩에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제