내 생각에 다형성은 런타임시 기본 클래스 유형에 따라 다릅니다. ? A
정적 다형성라고 왜함수/메서드를 호출하면 C++에서 정적 다형성으로 오버로드되는 이유는 무엇입니까?
void A(int a){}
void A(int a, int b){}
내가 개념을 궁금해 단지 해요 : 과부하로 먼저 같은 오늘 대기하고 있던 또한 다형성 (polymorphism)이다.
가상 테이블도 있습니까?
내 생각에 다형성은 런타임시 기본 클래스 유형에 따라 다릅니다. ? A
정적 다형성라고 왜함수/메서드를 호출하면 C++에서 정적 다형성으로 오버로드되는 이유는 무엇입니까?
void A(int a){}
void A(int a, int b){}
내가 개념을 궁금해 단지 해요 : 과부하로 먼저 같은 오늘 대기하고 있던 또한 다형성 (polymorphism)이다.
가상 테이블도 있습니까?
다형성은 피 호출자가 발신자로부터 메시지를 수신 할 때 수행 방법을 결정하는 것을 의미합니다.
"앞으로 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
과 함께 고려할 때 다형성의 형태가 아닙니다.
감사합니다 그래서 세부 사항 및 예제지만, 나는 이상하게 생각합니다. 왜 문자열'+'연산자와'begin (Stopwatch sw);'가 아닌가요? 'go_forward'는 두 개의 함수를 가지고 있지만 컴파일 타임에'begin'과 똑같은 것을 처리 할지라도, 다른 매개 변수 (들)은'begin (Iterator
@LoranceChen 기본 클래스와 아무런 관련이 없습니다. 의미는 중요합니다. 정수 추가 및 부동 소수점 숫자 추가는 둘 다 추가됩니다. 그러나 숫자와 문자열 연결을 추가하는 것은 똑같지 않습니다. –
em ... "똑같은 것"이 무엇입니까? – LoranceChen
아니요, * 정적 *은 컴파일 타임에 해결된다는 의미이므로 가상 테이블을 사용하지 않습니다. [Function overloading]에 대한 위키 피 디아 문서 (https://en.wikipedia.org/wiki/Function_overloading)는 다음과 같이 요약합니다. * "메서드를 오버로드하면 실제로 동일한 메서드를 여러 가지 방법으로 만듭니다. 이름. "* – UnholySheep
이것은 정적 다형성의 예라고 생각하지 않습니다. 일부 함수 오버로딩은 정적 다형성으로 사용되며 일부 다른 함수 오버로드는 사용되지 않습니다. –
@NickyC, 예제를 보여 주거나 과부하 종류가 정적 다형성이라는 것을 설명해 주시겠습니까? – LoranceChen