산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

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); 
      }
};

// Main function for the program
int main() {
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // store the address of Rectangle
   shape = &rec;
   
   // call rectangle area.
   shape->area();

   // store the address of Triangle
   shape = &tri;
   
   // call triangle area.
   shape->area();
   
   return 0;
}

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

Parent class area :
Parent class area :

잘못된 출력의 이유는 함수 area()의 호출이 기본 클래스에 정의된 버전으로 컴파일러에 의해 한 번 설정되기 때문입니다. 이것을 정적 해상도라고 합니다. 함수 호출 또는 정적 연결 - 함수 호출은 프로그램이 실행되기 전에 고정됩니다. 이를 조기 바인딩이라고도 합니다. 프로그램을 컴파일하는 동안 area() 함수가 설정되기 때문입니다.

그러나 이제 프로그램을 약간 수정하고 virtual 키워드를 사용하여 Shape 클래스의 area() 선언 앞에 둡시다. 이렇게 보이도록 -

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 클래스의 객체 주소는 *모양으로 저장되기 때문에 해당 area() 함수가 호출됩니다.

보시다시피 각 자식 클래스에는 area() 함수에 대한 별도의 구현이 있습니다. 이것이 다형성입니다. 일반적으로 사용됩니다. 같은 이름의 함수를 가진 다른 클래스가 있고 매개변수도 같지만 구현은 다릅니다.

가상 기능

가상 function은 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 언어

  1. C++ 연산자
  2. C++ 프로그래밍에서 함수에 배열 전달
  3. C++ 클래스 및 개체
  4. C++ friend 함수 및 friend 클래스
  5. C++ 클래스 템플릿
  6. 예제를 사용한 C++ 연산자 오버로딩
  7. C++의 스토리지 클래스
  8. C++ 오버로딩(연산자와 함수)
  9. C++의 데이터 추상화
  10. C++의 데이터 캡슐화