新着情報TOP > c++ virtual 함수 예제

c++ virtual 함수 예제

C++에서는 가상 함수를 사용하여 런타임시 클래스의 멤버 함수가 선택됩니다. 기본 클래스의 함수는 파생된 클래스의 이름이 같은 함수에 의해 재정의됩니다. 파생 클래스는 기본 클래스 멤버 함수를 완전히 대체(“재정의”) 하거나 파생 클래스가 기본 클래스 멤버 함수를 부분적으로 대체(“augment”)할 수 있습니다. 후자는 원하는 경우 파생 된 클래스 멤버 함수가 기본 클래스 멤버 함수를 호출하여 수행됩니다. 비가상 멤버 함수는 정적으로 해결됩니다. 즉, 멤버 함수는 개체에 대한 포인터(또는 참조)의 형식에 따라 정적으로(컴파일 타임) 선택됩니다. 순수 가상 함수는 파생 클래스에서 재정의해야 하며 정의할 필요가 없는 함수입니다. 가상 함수는 호기심 =0 구문을 사용하여 “순수”로 선언됩니다. 예: 파생 된 클래스의 함수는 형식이 동일한 경우에만 기본 클래스의 가상 함수를 재정의합니다.

파생 클래스의 함수는 반환 형식에서만 기본 클래스의 가상 함수와 다를 수 없습니다. 인수 목록도 달라야 합니다. 컴파일러는 하나 이상의 가상 함수가 있는 각 클래스에 대해 v 테이블을 만듭니다. 예를 들어, 클래스 Circle에 draw() 및 move() 및 크기 조정()에 대한 가상 함수가 있는 경우, gazillion Circle 개체가 있더라도 클래스 Circle과 연결된 V 테이블이 하나 있으며 각 원 오브젝트의 v-포인터가 원형 v-테이블. v-table 자체에는 클래스의 각 가상 함수에 대한 포인터가 있습니다. 예를 들어 Circle v-테이블에는 Circle::draw(포인터), Circle:::move() 포인터, Circle:::resize()에 대한 포인터 등 세 개의 포인터가 있습니다. 참조: 가상 함수를 http://www.drbio.cornell.edu/pl47/programming/TICPP-2nd-ed-Vol-one-html/Frames.html http://en.wikipedia.org/wiki/Virtual_function http://en.wikipedia.org/wiki/Virtual_method_table 기본 클래스 내에서 선언되고 파생 클래스에 의해 다시 정의(재정의됨)됩니다. 포인터 또는 기본 클래스에 대한 참조를 사용하여 파생 된 클래스 개체를 참조할 때 해당 개체에 대한 가상 함수를 호출하고 파생 된 클래스의 함수 버전을 실행할 수 있습니다. 개체를 만들도록 요청할 때 간접을 사용하는 기술을 “가상 생성자”라고 도합니다. 예를 들어 TC++PL3 15.6.2를 참조하십시오.

또한 가상 함수가 있는 클래스의 개체에는 가상 함수 호출 메커니즘(일반적으로 개체당 한 단어)에 필요한 공간이 필요합니다. 이 오버헤드는 중요할 수 있으며 다른 언어(예: C 및 Fortran)의 데이터와 레이아웃 호환성을 얻을 수 있습니다. 기본 클래스에 가상으로 선언된 함수가 포함되어 있고 파생 클래스가 동일한 함수를 정의한다고 가정합니다. 파생 클래스의 함수는 기본 클래스에 대한 포인터 또는 참조를 사용하여 호출되는 경우에도 파생 된 클래스의 개체에 대해 호출됩니다. 다음 예제에서는 PrintBalance 함수의 구현을 제공 하는 기본 클래스와 두 개의 파생 된 클래스 정적 입력 멤버 함수 호출의 적법성이 가능한 한 빨리 확인 됩니다 의미 합니다.컴파일러에서 컴파일러에 의해 시간. 컴파일러는 포인터의 정적 형식을 사용하여 멤버 함수 호출이 합법적인지 여부를 확인합니다.