본문 바로가기
Study/C++

[C++]업캐스팅과 가상함수, 순수가상함수

by DawIT 2020. 12. 13.
320x100

업캐스팅이란?

클래스 객체를 기반 클래스(부모 클래스)로 변환하는것

-> 다형성 구현을 위해 필요

 

기본적으로는 업캐스팅 시 원래 자식 클래스의 메소드는 접근이 불가능

그러나

virtual 키워드를 통해 부모 클래스에서 가상 함수임을 지정해주면

자식 클래스의 해당 함수에 접근이 가능하다.

이는 컴파일시 호출될 함수를 결정하는 정적 바인딩(static binding) 이 아닌 런타임시 호출할 함수를 결정하는 동적 바인딩(dynamic binding)을 사용하기 때문이다.

 

 

이렇게 클래스를 생성할 때 부모 클래스의 메소드에 virtual 키워드를 붙이지 않는다면,

 

 

parent 포인터에 자식 객체를 담고 WhatIsMe() 함수를 호출해도 부모 클래스의 메소드가 호출된다.

 

그런데 만약 virtual 키워드를 부모 클래스의 메소드 앞에 붙여준다면?

 

 

이렇게 키워드 하나의 추가로 자식 클래스의 메소드를 알아서 호출해준다.

 

그냥 가상 함수는 자식 클래스에서 새로 정의하지 않더라도 부모 클래스의 그것이 호출된다.

 

그러나 순수 가상 함수(pure virtual method)는 자식 클래스에서 선언하지 않는다면 컴파일러는 오류를 뱉는다

 

순수 가상 함수는 이렇게 선언해주면 된다.

 

그렇다면 순수 가상 함수와 그냥 가상 함수는 어떨 때에 써야 하는 걸까?

 

  • 가상 함수는 자식 클래스가 그 기능을 원한다면 다시 재정의해서 쓸 수 있다. 필수적으로 재정의해야 하는 것은 아니고, 필요에 의해 재정의하면 된다.
  • 순수 가상 함수는 자식 클래스는 무조건 이 함수를 재정의해서 내부를 만들어주어야 한다.

예시

class Shape
{
	// 무조건 재정의하지 않아도 기본적으로 "Shape"
	virtual void WhatIsMe()
	{
		cout << "Shape" << endl;
	}

	// 도형마다 넓이를 구하는 방법이 다르지만
	// 무조건 포함해야 하는 함수 getArea()
	virtual double getArea() = 0;
};

class Rectangle : public Shape
{
private:
	double x;
	double y;

public:
	void WhatIsMe()
	{
		cout << "Rectangle" << endl;
	}

	double getArea()
	{
		return x * y;
	}
};

class Circle : public Shape
{
private:
	double r;

public:
	void WhatIsMe()
	{
		cout << "Circle" << endl;
	}

	double getArea()
	{
		return r * r * 3.14;
	}
};

댓글