추천, 2024

에디터의 선택

C ++에서 함수 오버로딩과 재정의 차이점

다형성은 OOP의 중요한 특징 중 하나입니다. 단순히 '여러 형식에 하나의 이름 사용'을 의미합니다. 다형성은 '함수 오버로딩', '연산자 오버로딩'및 '가상 함수'를 사용하여 구현할 수 있습니다. '오버로딩'과 '오버 라이딩'은 모두 다형성의 개념을 의미합니다. 여기서 '오버로딩'은 컴파일 타임 다형성이고 '오버라이드'는 실행 시간 다형성입니다. 우리가 '오버로딩'과 '오버라이드'의 주된 차이점에 관해 이야기한다면, 더 공부할 수 있습니다. '오버로딩'에서 오버로드 된 함수는 같은 함수 이름으로 재정의하지만 다른 수와 유형의 매개 변수는 재정의합니다. 오버라이드 된 함수의 프로토 타입은 프로그램 전체에서 동일하지만 오버라이드 할 함수 앞에는 기본 클래스의 키워드 'virtual'이 오며 키워드없이 파생 클래스에 의해 재정의됩니다.

또한 비교 차트를 사용하여 오버로드와 오버라이드의 차이점을 연구합니다.


비교 차트 :

비교의 근거오버로딩무시
원기프로토 타입은 숫자 또는 매개 변수의 유형이 다를 수 있으므로 다릅니다.프로토 타입의 모든 측면은 동일해야합니다.
예어과부하 중 키워드가 적용되지 않았습니다.재정의 될 함수 앞에는 기본 클래스에 키워드 'virtual'이 붙습니다.
식별 요소매개 변수의 수 또는 유형이 달라서 함수의 버전이 호출되는지 여부를 결정합니다.어떤 클래스의 함수가 포인터에 의해 호출되는지는 클래스의 객체가 해당 포인터에 할당 된 주소에 의해 결정됩니다.
패턴 정의함수는 동일한 이름으로 재정의되지만 매개 변수의 수와 유형이 다릅니다.함수가 정의되고, 메인 클래스에서 키워드 'virtual'이 선행되고 out 키워드를 사용하여 파생 클래스에 의해 재정의됩니다.
성취의 시간컴파일 시간.실행 시간.
생성자 / 가상 함수생성자가 오버로드 될 수 있습니다.가상 함수를 재정의 할 수 있습니다.
폐물 소각로
소멸자는 오버로드 될 수 없습니다.소멸자를 재정의 할 수 있습니다.
제본오버로딩은 초기 바인딩을 수행합니다.재정의는 후기 바인딩을 나타냅니다.

오버로딩의 정의

컴파일 타임 다형성을 '오버로딩'이라고합니다. 오버로딩은 다형성의 개념에서 생성되므로 "여러 메소드에 대한 공통 인터페이스"를 제공합니다. 즉, 함수가 오버로드되면 다시 정의되는 동안 동일한 함수 이름을 포함합니다.

오버로드 된 기능은 다른 '번호 또는 유형의 매개 변수'와 관련하여 다릅니다. 하나의 오버로드 된 기능이 다른 기능과 구별됩니다. 이러한 방식으로 컴파일러는 어떤 오버로드 된 함수가 호출되는지를 인식합니다. 가장 일반적으로 오버로드 된 함수는 '생성자'입니다. '복사 생성자'는 일종의 '생성자 오버로딩'입니다.

C ++에서 오버로딩 구현

 클래스 오버로드 {int a, b; public : int load (int x) {// 첫 번째 load () 함수 a = x; a를 돌려 보내십시오; } int load (int x, int y) {// 두 번째 load () 함수 a = x; b = y; a * b를 돌려 준다; }}; int main () {오버로드 O1; O1.load (20); // 첫 번째 load () 함수 호출 O1.load (20, 40); // 두 번째 load () 함수 호출} 

여기에 클래스 오버로드의 function load ()가 오버로드되었습니다. 클래스의 두 가지 오버로드 된 함수는 첫 번째 load () 함수가 단일 정수 매개 변수 만 받아들이는 방식으로 구분되는 반면 두 번째 load () 함수는 두 개의 정수 매개 변수를 받아들이는 방식으로 구분할 수 있습니다. 클래스 오버로드 객체가 단일 매개 변수로 load () 함수를 호출하면 첫 번째 load () 함수가 호출됩니다. load () 함수가 두 개의 매개 변수를 전달하면 두 번째 load () 함수가 호출됩니다.

재정의 정의

실행 중에 얻은 다형성을 '재정의 (override)'라고합니다. '상속'과 '가상 함수'를 사용하여 수행됩니다. 재정의 할 함수 앞에는 기본 클래스의 키워드 'virtual'이 나오고 키워드가없는 파생 클래스에서 다시 정의됩니다.

재정의 (overriding)의 경우 기억해야 할 가장 중요한 것 중 하나는 재정의 된 클래스의 프로토 타입이 파생 클래스가 재정의하는 동안 변경해서는 안됩니다. 재정의 된 함수에 호출이 주어지면 C ++은 함수 호출이 수행되는 '포인터가 가리키는 객체의 유형'을 기반으로 호출되는 함수의 버전을 결정합니다.

C ++에서 재정의 구현

 class base {public : virtual void funct () {// 기본 클래스의 가상 함수 cout << "기본 클래스의 funct ()"; }}; class derived1 : public base {public : void funct () {// 파생 클래스에서 재 정의 된 기본 클래스의 가상 함수 cout << "derived1 클래스의 funct ()"; }}; class derived2 : public base {public : void funct () {// derived 클래스 2에서 재정의 된 기본 클래스의 가상 함수 cout  funct (); // derived1 클래스의 funct ()를 호출합니다. * p = & d2; p-> funct (); // derived2 클래스의 funct ()를 호출하십시오. 0을 반환; } 

여기에는 두 개의 파생 클래스에 의해 공개적으로 상속되는 단일 기본 클래스가 있습니다. 가상 함수는 'virtual'키워드로 기본 클래스에 정의되며 키워드가없는 파생 클래스 모두에 의해 다시 정의됩니다. main ()에서 기본 클래스는 포인터 변수 'p'와 객체 'b'를 만듭니다. 'derived1'클래스는 d1 개체를 만들고 derived2 클래스는 d2 '개체를 만듭니다.

이제 초기에 기본 클래스의 객체 'b'의 주소가 기본 클래스 'p'의 포인터에 할당됩니다. 'p'는 funct () 함수를 호출하므로 기본 클래스의 함수가 호출됩니다. 그런 다음 derived1 클래스 객체 'd1'의 주소가 포인터 'p'에 할당되고, 다시 funct ()를 호출합니다. 여기에서 derived1 클래스의 function funct ()가 실행됩니다. 마지막으로 포인터 'p'가 derived2 클래스의 객체에 할당됩니다. 그런 다음 'p'는 derived2 클래스의 func () 함수를 실행하는 funct () 함수를 호출합니다.

derived1 / derived2 클래스가 funct ()를 재정의하지 않으면 가상 함수가 '계층 적'이므로 기본 클래스의 funct ()가 호출되었을 것입니다.

오버로딩과 오버라이드의 주요 차이점

  1. 오버로드되는 함수의 프로토 타입은 오버로드 된 함수에 전달되는 매개 변수의 유형 및 개수 때문에 다릅니다. 반대로 오버라이드 된 함수가 속한 다른 클래스에 대해 다른 동작을 수행하기 때문에 동일한 유형 및 개수의 매개 변수로 오버라이드 된 함수의 프로토 타입이 변경되지 않습니다.
  2. 오버로드 된 함수 이름은 키워드 앞에 붙지 않지만 오버 라이드 된 함수의 이름은 기본 클래스의 키 "가상"앞에옵니다.
  3. 어떤 오버로드 된 함수가 호출되는지는 함수에 전달 된 매개 변수의 유형 또는 수에 따라 다릅니다. 클래스가 호출되는 재정의 된 함수는 함수를 호출 한 포인터에 할당 된 클래스의 객체 주소에 따라 달라집니다.
  4. 어느 오버로드 된 함수를 호출 할 것인가는 컴파일하는 동안 해결됩니다. 호출 할 재정의 된 함수는 런타임 중에 해결됩니다.
  5. 생성자는 오버로드 될 수 있지만 오버라이드 될 수 없습니다.
  6. 소멸자는 오버로드 될 수 없지만 오버라이드 될 수 있습니다.
  7. 오버로딩은 오버로드 된 함수가 호출 될 때 조기 바인딩을 수행하며, 컴파일하는 동안 해결됩니다. 재정의하면 재정의 된 함수가 호출 될 런타임 바인딩이 런타임 중에 해결됩니다.

유사점

  1. 둘 다 클래스의 멤버 함수에 적용됩니다.
  2. 다형성은 두 가지의 기본 개념입니다.
  3. 오버로드 및 오버라이드를 함수에 적용하는 동안 함수 이름은 동일하게 유지됩니다.

결론

오버로딩과 오버라이드도 비슷하게 보입니다.하지만 그렇지 않습니다. 함수는 오버로드 될 수 있지만, 어떤 클래스도 나중에 오버로드 된 함수를 재정의 할 수 없습니다. 가상 함수를 오버로드 할 수 없습니다. 그들은 단지 오버라이드 될 수있다.

Top