C++다 중 및 가상 함수 상세 분석

다 태 는 글자 그대로 여러 형태 라 는 뜻 이다.클래스 간 에 차원 구조 가 존재 하고 클래스 간 에 계승 을 통 해 관련 이 있 을 때 다 태 를 사용한다.
C+다 태 는 구성원 함 수 를 호출 할 때 호출 함수 의 대상 유형 에 따라 서로 다른 함 수 를 실행 한 다 는 것 을 의미한다.
아래 의 실례 에서 기류 Shape 는 두 종류 로 파생 되 었 는데 다음 과 같다.

#include <iostream> 
using namespace std;
 
class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   int area()
   {
     cout << "Parent class area :" <<endl;
     return 0;
   }
};
class Rectangle: public Shape{
  public:
   Rectangle( int a=0, int b=0):Shape(a, b) { }
   int area ()
   { 
     cout << "Rectangle class area :" <<endl;
     return (width * height); 
   }
};
class Triangle: public Shape{
  public:
   Triangle( int a=0, int b=0):Shape(a, b) { }
   int area ()
   { 
     cout << "Triangle class area :" <<endl;
     return (width * height / 2); 
   }
};
//       
int main( )
{
  Shape *shape;
  Rectangle rec(10,7);
  Triangle tri(10,5);
 
  //        
  shape = &rec;
  //            area
  shape->area();
 
  //         
  shape = &tri;
  //             area
  shape->area();
  
  return 0;
}
위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
Parent class area
Parent class area
오류 출력 을 초래 한 이 유 는 호출 함수 area()가 컴 파일 러 에 의 해 기본 버 전 으로 설정 되 었 기 때 문 입 니 다.이것 이 바로 정적 다 형 또는 정적 링크-함수 호출 은 프로그램 이 실행 되 기 전에 준비 되 었 습 니 다.때때로 이것 은 조기 귀속 이 라 고도 불 린 다.왜냐하면 area()함 수 는 프로그램 컴 파일 기간 에 이미 설정 되 어 있 기 때문이다.
그러나 지금 은 프로그램 을 약간 수정 합 니 다.Shape 류 에서 area()의 성명 전에 키워드 virtual 을 설치 합 니 다.다음 과 같 습 니 다.

class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   virtual int area()
   {
     cout << "Parent class area :" <<endl;
     return 0;
   }
};
수정 후 앞의 인 스 턴 스 코드 를 컴 파일 하고 실행 할 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
Rectangle class area
Triangle class area
이때 컴 파일 러 는 포인터 의 내용 을 보 는 것 이지 유형 이 아니다.따라서 tri 와 rec 류 의 대상 주 소 는*shape 에 저장 되 어 있 기 때문에 각자 의 area()함 수 를 호출 합 니 다.
보시 다시 피 모든 하위 클래스 는 함수 area()의 독립 적 인 실현 이 있 습 니 다.이것 이 바로 다 태 적 인 일반적인 사용 방식 이다.다 중 모드 가 있 으 면 여러 개의 다른 클래스 가 있 을 수 있 습 니 다.모두 같은 이름 을 가지 고 있 지만 서로 다른 실현 함 수 를 가지 고 있 습 니 다.함수 의 매개 변 수 는 심지어 같 을 수 있 습 니 다.
가상 함수
가상 함 수 는 기본 클래스 에서 키워드 virtual 성명 을 사용 하 는 함수 입 니 다.파생 클래스 에서 기본 클래스 에서 정의 하 는 가상 함 수 를 다시 정의 할 때 컴 파일 러 에 정적 으로 이 함수 에 연결 하지 말 라 고 알려 줍 니 다.
우리 가 원 하 는 것 은 프로그램 에서 호출 된 대상 유형 에 따라 호출 된 함 수 를 선택 할 수 있 는 것 입 니 다.이러한 조작 은 동적 링크 나 후기 바 인 딩 이 라 고 합 니 다.
순 허 함수
파생 클래스 에서 이 함 수 를 대상 에 게 더 잘 적용 할 수 있 도록 기본 클래스 에서 가상 함 수 를 정의 하려 고 할 수 있 습 니 다.그러나 기본 클래스 에 서 는 가상 함수 에 의미 있 는 실현 을 할 수 없습니다.이 럴 때 는 순수 가상 함 수 를 사용 합 니 다.
우 리 는 기본 클래스 의 가상 함수 area()를 다음 과 같이 바 꿀 수 있 습 니 다.

class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   // pure virtual function
   virtual int area() = 0;
};
=0 컴 파일 러 에 게 함 수 는 주체 가 없고 위의 허 함 수 는 순 허 함수 라 고 알려 줍 니 다.
이상 은 C++다 태 와 허 함수 의 상세 한 내용 을 상세 하 게 분석 하고 C++다 태 와 허 함수 에 관 한 자 료 는 우리 의 다른 관련 문장 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기