C++의 다형성을 지원하기 위해 동적 바인딩과 정적 바인딩을 사용합니다. 차이점을 이해하면 다형성을 더 잘 이해하고 프로그래밍 중에 실수를 방지하는 데 도움이 됩니다.
네 가지 명사를 이해해야 합니다.
1. 객체의 정적 유형: 객체가 선언될 때 사용되는 유형입니다. 컴파일 타임에 결정됩니다.
2. 객체의 동적 유형: 현재 가리키는 객체의 유형입니다. 런타임 중에 결정됩니다. 객체의 동적 유형은 변경할 수 있지만 정적 유형은 변경할 수 없습니다.
객체의 정적 유형과 동적 유형에 대해서는 예를 살펴보세요.
class B { } class C : public B { } class D : public B { } D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D* B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D* C* pC = new C(); pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C*
3. 정적 바인딩: 바인딩되는 것은 객체의 정적 유형입니다(예: 함수)는 객체에 따라 달라집니다. 정적 유형 지정은 컴파일 타임에 발생합니다.
4. 동적 바인딩: 바인딩되는 것은 객체의 동적 유형입니다. 특정 기능(예: 함수)은 객체의 동적 유형에 따라 달라지며 런타임 중에 발생합니다.
class B { void DoSomething(); virtual void vfun(); } class C : public B { void DoSomething();//首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。 virtual void vfun(); } class D : public B { void DoSomething(); virtual void vfun(); } D* pD = new D(); B* pB = pD;
자, pD->DoSomething()과 pB->DoSomething()이 동일한 함수를 호출하는지 살펴보겠습니다.
아니요. 비록 pD와 pB가 모두 동일한 개체를 가리킵니다. DoSomething 함수는 비가상 함수이기 때문에 정적으로 바인딩됩니다. 즉, 컴파일러는 컴파일 타임에 개체의 정적 유형을 기반으로 함수를 선택합니다. pD의 정적 유형은 D*이므로 컴파일러는 pD->DoSomething()을 처리할 때 D::DoSomething()을 가리킵니다. 같은 방식으로 pB의 정적 유형은 B*이고 pB->DoSomething()은 B::DoSomething()을 호출합니다.
다시 살펴보겠습니다. pD->vfun()과 pB->vfun()이 동일한 함수를 호출합니까?
그렇습니다. vfun은 가상 함수이기 때문에 동적으로 바인딩됩니다. 즉, pB와 pD는 서로 다른 정적 유형을 갖고 있지만 동시에 객체를 가리키며 동적 유형은 다음과 같습니다. 동일합니다. D*이므로 동일한 함수인 D::vfun()을 호출합니다.
위 내용은 모두 객체 포인터에 대한 것이며 참조에도 동일하게 적용됩니다.
포인터와 참조의 동적 및 정적 유형은 일관성이 없을 수 있지만 객체의 동적 및 정적 유형은 일관성이 있습니다.
D D;
D.DoSomething() 및 D.vfun()은 항상 D::DoSomething() 및 D::vfun()을 호출합니다.
동적으로 바인딩되는 것과 정적으로 바인딩되는 것에 대해 아주 잘 요약한 기사가 있습니다.
한 문장으로 요약했습니다. 가상 함수만 동적 바인딩을 사용하고 나머지는 모두 물론입니다. 현재까지 이 문장에 해당되지 않는 내용을 찾지 못했습니다. 만약 오류가 있다면 지적해주시기 바랍니다.
특별한 주의가 필요한 것
기본 매개변수와 가상 기능이 함께 나타나면 상황이 좀 복잡해지고 실수하기 쉽습니다. 가상 함수는 동적으로 바인딩된다는 것을 알고 있지만 실행 효율성을 위해 기본 매개변수는 정적으로 바인딩됩니다.
class B { virtual void vfun(int i = 10); } class D : public B { virtual void vfun(int i = 20); } D* pD = new D(); B* pB = pD; pD->vfun(); pB->vfun();위 분석에서 pD->vfun() 및 pB->vfun() 호출은 모두 D::vfun() 함수임을 알 수 있는데, 기본 매개변수는 무엇인가요?
C++는 Google의 4가지 공식 언어 중 하나입니다. 그러나 Google은 실제로 최근 몇 년 동안 go 언어를 출시했으며 그 포지셔닝은 c/c++와 유사합니다. 이러한 상황을 고려하면, 구글 프로그래머들은 C++의 복잡성을 깊이 인식하고 있어 C++에 대한 대체 언어를 개발하고 싶어하는 것이 아닐까 생각됩니다. 시간이 있으면 Go 언어에 대해 배우고 Go 언어가 C++와 같은 문제에 대해 어떻게 선택하는지 살펴봐야 합니다.
C++의 동적 바인딩과 정적 바인딩의 응용에 대해 더 깊이 이해하려면 PHP 중국어 웹사이트의 관련 기사를 주목하세요!