다형성
다형성은 객체지향 프로그래밍의 중요한 특징 중 하나입니다. 문자 그대로의 의미는 여러 형태, 여러 모양으로 간단히 이해될 수 있습니다. 실제로 본질적인 의미는 동일합니다. 객체지향 프로그래밍에서는 동일한 메소드가 다른 객체에 의해 실행될 때 다른 실행 효과를 갖는다는 것을 의미합니다.
구체적으로 다형성의 구현은 컴파일 타임 다형성과 런타임 다형성의 두 가지 유형으로 나눌 수 있습니다. 전자는 컴파일 시 결정되는 특정 연산 프로세스이고, 후자는 프로그램 실행 중에만 결정되는 연산 프로세스이다. 이러한 작업 프로세스 결정은 바인딩 (바인딩 이라고도 함)입니다.
컴파일 및 연결 중에 확인되는 바인딩을 정적 바인딩 이라고 합니다. 앞서 배운 함수 템플릿의 인스턴스화 및 함수 오버로딩이 이 범주에 속합니다. 다른 하나는 실행 중일 때 어떤 코드가 실행되는지 확인하는 것인데, 이를 동적 바인딩 이라고 합니다. 이 경우 컴파일 시에는 어떤 코드가 실행되는지 확인할 수 없고 프로그램이 실행된 후에만 확인할 수 있습니다. 달리다.
둘을 비교해 보면, 정적 바인딩은 컴파일 과정에서 실행 방법이 이미 결정되어 있어 실행이 효율적이지만 동적 바인딩은 속도가 느려야 하지만 유연성이 장점입니다. 둘 다 고유한 장점과 서로 다른 사용 시나리오를 가지고 있습니다.
아래에서는 정적 링크에 대한 간단한 예를 제공합니다.
/************************************//Des: C++ 튜토리얼 데모//저자: Huang/ /저작권:www.dotcpp.com//날짜:2017/12/20************************************ *** ** *****/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this->y=y ;}더블레아 (){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea(){returnPI*r*r ;}};intmain(){포인트A (10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area()<<endl;Point*p;p=&B;cout<< p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
두 개의 클래스, 즉 도트 클래스와 파생된 원 클래스가 정의되어 있습니다. 기본 함수의 코드와 네 가지 출력 영역 결과는 다음과 같습니다.
코드를 비교하여 네 가지 출력을 이해할 수 있습니다.
첫 번째 cout에서는 Point 클래스의 Area 메소드인 A의 면적을 출력하므로 면적은 0이므로 문제가 없습니다.
두 번째 cout에서는 당연히 파생 클래스인 Circle의 면적법인 B의 면적을 출력하는데, 면적은 당연히 공식에 따라 계산되며 값은 1256.64로 문제가 되지 않는다.
세 번째 cout은 Point 유형 포인터 p가 가리키는 Circle 클래스 객체의 영역 메서드를 출력합니다. 이는 분명히 Point 클래스의 영역 메서드입니다. 여기서 C++에서 구현하는 것은 정적 바인딩입니다. 즉, 컴파일할 때 p의 유형을 기준으로 어느 영역을 실행할지 결정하므로 0입니다.
네 번째 유형의 cout도 동일한 방식으로 작동합니다. 이는 Circle 유형 객체를 Point 유형 참조에 할당하며 또한 정적 바인딩을 수행하고 0을 출력합니다.
분명히 이것은 우리가 기대하는 결과가 아닙니다. 실제로 포인터와 참조의 경우 포인터와 참조의 유형을 맹목적으로 결정하는 것보다 실제 객체의 메서드를 실행하는 것을 선호합니다.
우리의 요구 사항을 충족하려면 포인터나 참조의 유형에 관계없이 가리키는 실제 개체를 기반으로 유연하게 결정해야 합니다. 그런 다음 이 기본 정적 바인딩 방법을 변경하고 동적 바인딩을 사용해야 합니다. 즉, 런타임에 유연하게 결정됩니다.
다음 섹션에서는 모두를 위해 가상 기능에 대해 자세히 설명하겠습니다!