Person * ptr; //포인터 변수 선언
ptr = new Person(); //포인터 변수의 객체 참조
위 코드가 실행되면, 포인터 ptr은 Person 객체를 가리키게 된다.
하지만, Person형 포인터는 Person객체 뿐만 아니라,
Person을 상속하는 유도 클래스의 객체도 가리킬 수 있다.
Code 33, 34 줄을 봤을 때, Person포인터 변수는 Person객체와
Person을 직접 or 간접적으로 상속하는 모든 객체를 가리킬 수 있다.
Person, Student, Part-Time Student
모든 함수가 상속관계에 있지만, Show()함수와 Show_state()함수가 각 각의 이름과 형태가 같은 함수로 선언이 가능.
ptr1의 객체는 Student이다.
하지만, Student의 멤버 함수 ShowStudent() 호출 시 Error가 발생함.
이는 포인터 자료형이 Person으로 선언되어 있기 때문에, Person의 Show()함수는호출이 가능하다.
“C++ 컴파일러는 포인터 연산의 가능성 여부를 판단 할 떄, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.”
순수 가상함수화 하지 않을 경우, 객체생성이 목적이 아닌 클래스가 선언이 가능하다. => 개발자 오류..?
Virtual void Show() const = 0;
위 처럼. 함수 옆에 "=0" 선언으로 순수 가상함수화.
Walk* wptr = new Walk();
으로 선언 시 컴파일 에러가 발생한다.
객체지향언어가 c언어보다 느린 이유
: 가상함수가 포함되면, v-table이 생성되고, 테이블을 참조할 함수가 결정되므로 실행속도가 감소한다.