#include <iostream>
using namespace std;
class A
{
public:
virtual void print() { cout << "A" << "\n"; }
};
class B : public A
{
public:
void print() { cout << "B" << "\n"; }
};
class C : public B
{
public:
void print() { cout << "C" << "\n"; }
};
class D : public C
{
public:
void print() { cout << "D" << "\n"; }
};
int main()
{
A a;
//a.print();
B b;
//b.print();
C c;
//c.print();
D d;
//d.print();
// 포인터만 바꿔줌
// A &ref = b;
// ref.print(); // A가 나온다. A인것처럼 작동한다. (virtual이 없으면)
// virtual이 있으면 B가 나온다.
// A &ref = c;
// ref.print(); // C가 나온다. B에 virtual이 없어도 C가 나옴.
B &ref = c;
ref.print(); // C가 나온다. B가 A를 상속받았기 때문. 가장 상위 클래스의 함수가 virtual이라면 자식 클래스의 함수들도 virtual 영향을 받음.
// 자식 클래스의 함수에 virtual을 적어두면 상위 클래스의 함수를 오버라이딩 하는거구나 하고 표시할 수도 있다. 디버깅할 때 유용
// 오버라이딩할 함수의 리턴 타입은 같아야한다.
return 0;
}