먼저, 새로운 지식 포인트인 가상 함수를 소개하겠습니다.
이것은 어떤 종류의 기능입니까? 쉽게 말하면 함수 앞에 virtual을 선언한 함수인데 일반적인 형태는 다음과 같습니다.
가상 함수 반환 값 함수 이름(형식 매개 변수) {함수 본문}
그럼 그것은 무엇을 위해 사용됩니까? 가상 함수의 출현으로 함수와 함수 본문 간의 연결이 런타임에 설정될 수 있으며, 이를 동적 바인딩 이라고 합니다. 그런 다음 가상 함수의 파생 클래스가 실행 중일 때 런타임에 동적 바인딩에 따라 동일한 메서드를 실행하지만 결과가 다른 효과를 얻을 수 있는데, 이것이 소위 다형성입니다. 이런 방법으로 앞절의 문제를 해결하는 방법이 있습니다.
다음으로 기본 클래스의 영역 메서드를 가상 함수로 선언하기만 하면 됩니다. 그런 다음 기본 함수에 있는 Point 유형의 포인터나 참조를 대담하게 호출할 수 있으므로 유형 문제에 대해 걱정할 필요가 없습니다. 동적 바인딩을 달성하기 위해 실제 객체 유형을 기반으로 어떤 메서드를 호출할지 결정하기 때문입니다.
코드는 다음과 같습니다:
/************************************//Des: C++ 튜토리얼 데모//저자: Huang/ /저작권:www.dotcpp.com//날짜:2017/12/20************************************ *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
수정 후 다음과 같이 컴파일하고 실행합니다.
가상 함수의 역할과 다형성을 경험해 보려면 자신의 컴퓨터에서 실험해 보세요.
참고할 사항은 다음과 같습니다.
1. 가상 함수는 객체에 속하지 않기 때문에 정적 멤버 함수나 친구 함수가 될 수 없습니다.
2. 인라인 함수는 런타임 중에 해당 위치를 동적으로 확인할 수 없습니다. 가상 함수가 클래스 내부에 정의되어 있어도 컴파일 중에는 여전히 인라인이 아닌 것으로 간주됩니다.
3. 생성자는 가상 함수가 될 수 없고, 소멸자는 가상 함수가 될 수 있으며, 일반적으로 가상 함수로 선언됩니다.