즉, 함수의 정의가 파생 클래스에서 변경되고 해당 파생 클래스의 동적 할당 메모리에 대한 포인터가 변경된 함수를 호출하면 컴파일러는 "알 수없는"이유는 무엇입니까? 특히 기본 클래스가 아닌 호출되어야합니다?가상 키워드가 필요한 이유가 무엇입니까?
가상 키워드가 프로그래머의 이익을 위해 작동하지 않는 경우가 있습니까?
즉, 함수의 정의가 파생 클래스에서 변경되고 해당 파생 클래스의 동적 할당 메모리에 대한 포인터가 변경된 함수를 호출하면 컴파일러는 "알 수없는"이유는 무엇입니까? 특히 기본 클래스가 아닌 호출되어야합니다?가상 키워드가 필요한 이유가 무엇입니까?
가상 키워드가 프로그래머의 이익을 위해 작동하지 않는 경우가 있습니까?
virtual
키워드는 컴파일러에 동적 디스 패치을 구현하도록 지시합니다. 이것은 언어가 설계된 방법입니다. 이러한 키워드가 없으면 컴파일러는 동적 디스패치를 구현할지 여부를 알 수 없습니다. 일반적으로
virtual
의 단점 또는 동적 파견 그것은 약간의 성능 저하가
가상 함수는 비 - 가상 함수와 비교할 때 "오버 헤드"가 있습니다. 동일한 의미에서 이진 검색은 Quicksort보다 빠릅니다. 그들은 다른 일을하기 때문에 비교는 의미가 없습니다. 동적 디스패치가 필요한 경우 가상 함수를 사용하거나 가상 함수처럼 "느린"자체 다이나믹 디스패치 메커니즘을 구현합니다. – fredoverflow
@FredOverflow : 코스에 대한 개념, 말에 동의합니다. 동적 디스패치 기능이 필요한 경우 일반 정적 바인딩 기능과 비교하여 기능에 약간의 성과가 있습니다.동의, 사과와 배를 비교하는 것 같아요. –
나는 사과를 더 좋아한다. – fredoverflow
컴파일러는 알 수 없으므로 알 수 없습니다. 가상 기능을 사용하지 않으려는 의도 일 수도 있습니다. 왜냐하면 모든 기능과 관련된 비용이 항상 있기 때문입니다.
당신이 정말로 원하는 것을 지불해야합니다. 뭔가 줄 수 있어야합니다. –
한 가지 이유 :
라이브러리와 같은 별도의 모듈에있는 기본 클래스를 생각해 보자.
그리고 응용 프로그램에서 파생 된 클래스.
컴파일러는 주어진 함수가 가상이어야한다는 것을 라이브러리를 컴파일하는 동안 어떻게 알 수 있습니까?
이것이 OP의 질문을 가장 잘 나타내는 대답이라고 생각합니다. 컴파일러는 클래스를 컴파일하는 순간에 메소드가 실제로 사용되는지 여부를 추측 할 수 없습니다. –
C++의 주요 설계 원리 중 하나는 C++ does not incur overhead for features that are not used (the "zero-overhead principle")입니다. 이는 고성능에 초점을두고 있기 때문입니다.
이렇게 Java와 같은 언어에서는 가상 기능과 같은 기능을 선택해야하며, 기본적으로 기능은 가상입니다.
'가상'을 사용하지 않을 경우의 이점은 무엇입니까? 오버 헤드가 없습니다! –
확실한 대답은 확실하지 않지만 가상 키워드가 있으면 실행시 가상 포인터 테이블이 설정된다는 것을 의미합니다. 이는 성능에 약간의 영향이있을 수 있습니다. – ScoPi
http://en.wikipedia.org/wiki/Virtual_method_table –