Latest web development tutorials

C ++ 다형성

다형성은 말 그대로 다양한 형태 것을 의미한다.클래스 계층 사이의 상속을 통해 클래스 간의 관계, 그리고 다형성을 사용할 때.

C ++ 멤버 함수 다형성 평균을 호출하면, 함수가 호출 될 개체의 유형에 따라 서로 다른 기능을 수행 할 것이다.

다음 다음의 예에서, 기본 클래스의 형상은 두 개의 카테고리에 대해 유도된다 :

#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

프로그램의 실행 준비가되기 전에 호출 함수 - 오류의 원인이정적 다형성 또는 정적 링크라고하고,()는 기본 클래스 컴파일러 버전으로 설정되고 기능 영역을 호출 출력된다. 프로그램 컴파일 동안 영역 () 함수가 설정되어 있기 때문에 때때로는초기 바인딩 불린다.

다음과 같이하지만지금은, 첫 번째 영역 () 문 장소 프로그램이 약간 Shape 클래스에서 수정 한 키워드 가상하자:

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

이런 경우, 컴파일러가 아니라 그 종류보다는 콘텐츠를 볼 포인터이다. 따라서 이후의 어드레스 저장 및 트리 * 모양 REC 클래스 개체 및 그 각각의 영역 () 함수를 호출한다.

당신이 볼 수 있듯이, 각 클래스는 독립을 달성하기위한 하위 기능 영역 ()를 가지고있다. 이다형성 일반적으로 사용하는 것입니다.다형성을 사용하면, 여러 종류를 가질 수있는 모든 이름은 같지만 함수의 매개 변수의 함수도 동일한 다른 구현을 가질 수있다.

가상 함수

가상 함수는 기본 클래스 함수 가상키워드를 이용하여 선언된다. 재정의 기본 클래스의 가상 함수를 파생 클래스에 정의하면 정적 함수에 연결되지 컴파일러를 알려줍니다.

우리가 원하는 것은 호출 객체 함수 호출의 유형에 따라 선택 될 수있는 프로그램의 임의의 지점이며,이 동작은동적 링크 또는 지연 바인딩 불린다.

순수 가상 함수

이 것 당신은 너무 파생 클래스 객체에 더 적합 함수를 다시 정의, 기본 클래스의 가상 함수를 정의 할 수 있습니다,하지만 당신은, 기본 클래스에서이 시간을 가상 함수의 의미 구현을 줄 수 없다 순수 가상 함수를 사용합니다.

다음과 같이 우리는 읽을 클래스 가상 기능 영역 ()을 기반으로 할 수 있습니다 :

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 가상 함수가순수 가상 함수 위의 기능은, 시체가없는 컴파일러를 알려줍니다.