가상 함수와 다형성


#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;
}