1.상속 관계
2.대입 연산자 오버로딩
따라서 1번이 자연스럽게 가능
부모는 자식객체를 참조 하거나 포인터로 가르킬수 있다
부모가 자식 객체의 주소를 부모 포인터로 가르키거나 참조한다면
오직 자식 객체의 부모멤버들만 참조 할수 있다.
프로그램을 구성하는 요소들의 속성을 결정
정적 바인딩: 컴파일 하면서 결정, c/c++에서 변수 타입
동적 바인딩: 실행 하면서 결정, java 변수 타입
오버라이딩된 함수들이 자신의 객체 타입에 맞게 호출 되기 위해서는 동적 바인딩이 필요.
virtual 함수선언 통해 동적 바인딩 가능
base의 함수를 virtual로 하면 derived에서 그 함수를 오버라이딩하면 자동으로 virtual이 된다
(그래도 명시적으로 표시 해줄것!)
모든 가상 함수들의 주소들을 가상 함수 테이블에 저장한 뒤
자신의 실객체에 virtual 재정의가 없다면 그 위 부모 즉, 자신으로부터 base쪽으로 쭉 올라가면서 제일 먼저 찾게된 재정의를 동적 바인딩 한다.
객체를 만들필요가 없는 클래스
함수의 몸체가 없다
이것을 선언 함으로써 이 클래스는 추상클래스가 된다
derived에서 재정의 하지 않으면 똑같이 추상 클래스가 된다
derived에서 반드시 재정의 해야 한다
class school
{
private:
int student;
int teacher;
public:
virtual int get_student()=0;//순수 가상 함수
public:
school(){}
school(int _student,int _teacher) {}
~school(){}
}
class college
:public school
{
private:
int col_student;
int col_teacher;
public:
//순수 가상 함수 재정의,하지 않으면 추상클래스가 됨
virtual int get_student(){return col_student+school::get_student();}
public:
college(int _stu,int _tea,int _col_stu,int _col_tea): school(_stu,_tea)
,col_student(_col_stu),col teacher(_col_tea){ }
}