: virtual 키워드를 함수 앞에 붙임으로써, 다형성을 제공한다.
가상함수들의 함수포인터가 v-table에 저장되고,
자식 클래스가 부모의 virtual함수를 오버라이딩하면,
자식 클래스의 v-table에 오버라이딩 함수가 매핑된다.
상향형변환 상태에서 가상함수 포인터와 v-table을 이용해 오버라이딩 함수를 사용할 수 있따.
: 파생클래스가 기능을 물려받을 수 있고, 재정의 함으로써 새로운 기능을
구현할 수 있다.
-> derive 클래스의 소멸자가 호출되지 않은 것을 확인할 수 잇따.
=> 소멸자에 virtual이라는 키워드를 추가해야 한다.
: 부모 클래스에서는 자식에 보낼 함수를 virtual 키워드를 붙이고,
자식쪽은 상속받았다라는 의미로 override키워드를 붙여준다.
-> virtual 키워드를 붙여야만 cat클래스의 speak함수를 호출할 수 있다.
-> 파생클래스의 함수가 호출된다.
-> vitual 선언을 통해 이와 같은 문제를 해결할 수 있다.
=>일반 메서드는 참조형식을 따르지만, 가상함수는 실형식을 따른다.
: 상위클래스로 하위파생 클래스를 참조할 경우,
상위 클래스 형식을 추상 자료형이라고 한다.
사람 = new 원태
이 때 부모클래스의 소멸자를 virtual 사용하지 않으면 파생클래스의 소멸자가 호출되지 않으므로 반드시 소멸자에 virtual 키워드를 사용하도록 해야 한다.
: 상향형변환으로 객체를 동적할당한 후, delete를 할 경우, 포인터의 자료형인 참조형식의 값만 해제가된다. 실형식의 소멸자도
파생클래스의 소멸자도 호출하기 위해서 기본클래스의 소멸자에 반드시 vitual 키워드를 사용해야 한다.
만약에 파생클래스에 메모리 할당을 햇다면, 소멸자가 호출되지 않으므로 메모리 누수가 발생한다.
자료형은 부모 형식으로 선언했으므로, 부모의 소멸자만 호출된다. 하지만 소멸자에 virtual 선언으로 객체의 가상함수 테이블에 소멸자를 추가함으로써 포인터 제거시
파생클래스의 소멸자도 호출되는 것이다.
: 이것이 c++이다. 페이지 324
: 페이지 309를 보고 어떻게 출력 될것인가에 대해 예상해보자