2017-01-08 4 views
0

내 생각에 다형성은 런타임시 기본 클래스 유형에 따라 다릅니다. ? A 정적 다형성라고 왜함수/메서드를 호출하면 C++에서 정적 다형성으로 오버로드되는 이유는 무엇입니까?

void A(int a){} 
void A(int a, int b){} 

내가 개념을 궁금해 단지 해요 : 과부하로 먼저 같은 오늘 대기하고 있던 또한 다형성 (polymorphism)이다.
가상 테이블도 있습니까?

+4

아니요, * 정적 *은 컴파일 타임에 해결된다는 의미이므로 가상 테이블을 사용하지 않습니다. [Function overloading]에 대한 위키 피 디아 문서 (https://en.wikipedia.org/wiki/Function_overloading)는 다음과 같이 요약합니다. * "메서드를 오버로드하면 실제로 동일한 메서드를 여러 가지 방법으로 만듭니다. 이름. "* – UnholySheep

+0

이것은 정적 다형성의 예라고 생각하지 않습니다. 일부 함수 오버로딩은 정적 다형성으로 사용되며 일부 다른 함수 오버로드는 사용되지 않습니다. –

+0

@NickyC, 예제를 보여 주거나 과부하 종류가 정적 다형성이라는 것을 설명해 주시겠습니까? – LoranceChen

답변

1

다형성은 피 호출자가 발신자로부터 메시지를 수신 할 때 수행 방법을 결정하는 것을 의미합니다.

"앞으로 10m 이동하라"는 메시지를 생각해보십시오. 피 호출 사가 사람이라면 걷는 것입니다. 피 호출자가 자동차 인 경우, 자동차는 바퀴를 돌리면서 그렇게합니다.

다형성의 아이디어는 어떤 언어 기능이 관련되어 있는지 또는 수행시기 결정시기를 지정하지 않습니다. 우리는 가상 함수를 사용하여 런타임에이를 수행 할 수 있습니다. 우리는 함수 오버로딩, 템플릿 또는 악의 전 처리기 매크로를 사용하여 컴파일 타임 (정적 다형성)에서이 작업을 수행 할 수 있습니다. 우리는 함수 오버로드를 사용하는 경우

MovableObject* ptr = get_person(); 
ptr->go_forward(10); 

MovableObject* ptr2 = get_car(); 
ptr2->go_forward(10); 

:


모든 기능을 오버로드

void go_forward(Person& person, int distance); 
void go_forward(Car& car, int distance); 
이 다형성 (polymorphism)로 사용되는

우리는 가상 함수를 사용하는 경우.

오버로드를 통해 정적 다형성을 입증하려면 두 가지 간단한 프로그램을 고려하십시오.

// Program 1 
int a; 
int b; 
std::cin >> a >> b; 
int sum = a + b; 
std::cout << sum; 

// Program 2 
double a; 
double b; 
std::cin >> a >> b; 
double sum = a + b; 
std::cout << sum; 

대기. 그것은 그것이 과부하를 포함하지 않는 것처럼 보입니다, 그렇습니까?

사실 과부하가 있습니다. 두 프로그램 모두 표현식이 a + b입니다. 둘 다 우리에게 추가된다는 것을 의미합니다. 하지만 차이점은 다음과 같습니다. 프로그램 1의 +기계 명령어로 컴파일됩니다. 정수 추가; 프로그램 2의 +부동 소수점 추가으로 컴파일됩니다. 둘 다 추가되지만 실제 작업은 매우 다릅니다.

과부하입니까? 예, +이 오버로드되었습니다.

다형성입니까? 예, +은 두 경우 모두 호출자에게 동일한 작업을 의미하며 기본 작업은 다릅니다.

다른 용도로 +을 고려하십시오.

// Program 3 
std::string a; 
std::string b; 
std::cin >> a >> b; 
std::string sum = a + b; 
std::cout << sum; 

프로그램 3도 +를 사용합니다. 그러나 더 이상 추가가 아닙니다. 이제는 문자열 연결입니다.

과부하입니까? 예, +이 오버로드되었습니다.

다형성입니까? 아닙니다. 이제 프로그램 1과 2에 비해 의미가 다릅니다. 추가와 연결은 매우 다른 것입니다.


또 다른 예입니다.

표준 라이브러리 컨테이너를 생각해보십시오.

vector<int> my_vector; 
begin(my_vector); 

list<double> my_list; 
begin(my_list); 

과부하입니까? 예, begin이 오버로드되었습니다.

다형성입니까? 예, 두 버전 모두 begin은 반복기가 다른 유형 인 경우에도 첫 번째 요소를 가리키는 반복자를 반환합니다.

어때? 스톱워치를 나타내는 클래스와 함수 begin은 시간 측정을 시작합니다.

Stopwatch my_watch; 
begin(my_watch); 

과부하입니까? 예, begin이 오버로드되었습니다.

다형성입니까? 이번엔 아니야. 이 begin은 반복자를 얻지 못합니다. 그냥 스톱워치를 시작합니다. 그 의미는 다르므로 begin과 함께 고려할 때 다형성의 형태가 아닙니다.

+0

감사합니다 그래서 세부 사항 및 예제지만, 나는 이상하게 생각합니다. 왜 문자열'+'연산자와'begin (Stopwatch sw);'가 아닌가요? 'go_forward'는 두 개의 함수를 가지고 있지만 컴파일 타임에'begin'과 똑같은 것을 처리 할지라도, 다른 매개 변수 (들)은'begin (Iterator param)'과 같은 기본 클래스를 가져야합니다 소위 다형성?). 그러나'+'는 정말 놀랍습니다 .... – LoranceChen

+0

@LoranceChen 기본 클래스와 아무런 관련이 없습니다. 의미는 중요합니다. 정수 추가 및 부동 소수점 숫자 추가는 둘 다 추가됩니다. 그러나 숫자와 문자열 연결을 추가하는 것은 똑같지 않습니다. –

+0

em ... "똑같은 것"이 무엇입니까? – LoranceChen

관련 문제