Public Inheritance
class graduatestudent: public student{
public:
graduatestudent();
};
public으로 받으면 전달: public → public 전달x: private, 생성, 파괴자, 대입 연산자 오버로드
graduatestudent::graduatestudent(const string name, int id)
: student(name, id)
{
~~
}
Polymorphic Public Inheritance 자식 클래스에서 부모 클래스의 함수를 오버로드 할 수 있다. graduatestudent.func()와 student.func()가 다르게 작동할 수 있다는 뜻
만약 부모 클래스 버전의 함수를 쓰고 싶다면? graduatestudent.student::func()이렇게 쓰면 된다. - 포인터를 사용했을 때의 문제 발생:

의도는 graduatestudent display지만 student 버전으로 실행!
- virtual keyword
어떤 함수가 오버로드 될 것이라는 것을 선언하는 역할
부모 클래스의 함수 선언 맨 앞에 넣는다.
이러면 위의 문제가 해결된다.
- 포인터를 사용하면 Destructor에서도 문제가 발생하는데,
virtual 선언을 안해주면 부모 클래스의 파괴자가 호출된다.
따라서 virtual destructor 선언을 해주면
자식 클래스의 파괴자 호출 후 부모클래스의 파괴자가 호출된다.
따라서 virtual 선언은 오버로드된다면 해주자.
*생성자는 virtual일 필요 없다.
*파괴자는 virtual이어야 한다.
Static, Dynamic Binding
Access Control
Abstract Base Class
Private Inheritance 클래스 내부에 포함된 객체와 다루는 방식이 비슷하다 포함할 객체로부터 상속받는 것과 비슷하다고 보면 된다 왜 쓰는가? 사용할 객체의 protected를 쓰거나 오버라이드 하기 위해.

ex) student class
class student: private string, private valarray<double>
{
~
}
부모 클래스가 반대임! student 클래스는 private가 필요 없다(이미 제공)

이렇게 하고 상속받은 클래스의 method를 오버라이딩 할 수 있다.
상속받은 클래스의 객체가 필요하다면?

그냥 포함 관계일 때는 객체를 돌려주면 되지만 본인을 상속받은 클래스로 타입 캐스트해서 내보내면 된다
Protected Inheritance private inheritance와 비슷하나, public,protected가 protected로 넘어온다.
접근 재정의 만약 private나 protected로 상속받은걸 public처럼 쓰려면?
