개요

가상 함수에 대한 개념을 알고

업캐스팅, 다운캐스팅은 나중에 꼭 써보자

 


가상 함수

가상 함수는 상속관계에서 다형성을 지원하기 위한 기능이다.

가상 함수를 작성하기 위해서는 메소드 앞에 virtual 한정자를 작성한다.

class Base
{
public:
    virtual void Foo() // Foo()는 가상 함수
    {
        std::cout << "Base::Foo()\n";
    }
};
 
class Derived : public Base
{
public:
    void Foo() // 가상 함수 재정의는 그냥 정말 재정의를 해주면 된다.
    {
        std::cout << "Derived::Foo()\n";
    }
};

Base b;
Derived d;
 
Base& b1 = d; // 업캐스팅
b1.Foo(); // "Derived::Foo()"

 

 

오버라이딩 ( Overriding )

가상 함수의 내용을 재정의하는 것

업캐스팅을 통해 부모 클래스 타입을 가리키는 포인터나 레퍼런스로 다뤄야 한다.

 

일반적인 함수는 컴파일 단계에서 어떤 함수를 호출할 것인지 결정하는 정적 바인딩으로 동작하는 반면

가상 함수는 실행 시간에 어떤 함수를 호출할 것인지 결정하는 동적 바인딩으로 동작함

 

 

가상 함수 테이블 (Virtual Function Table)

각 인스턴스마다 가상 함수 포인터를 저장하는 가상함수 테이블이 있다.

가상 함수는 가상 함수 테이블의 주소값을 갖기 때문에 주소값 만큼의 크기를 갖는다.

 

 

추상 클래스

상위 타입을 정의하는데 사용한다.

인스턴스를 만들 수 없다.

class AbstractClass
{
  virtual void Foo() = 0; // 보통 선언만 한다. => 추상 클래스 (순수 가상 함수)
}

struct Base : Abstract // 오버라이딩 X => 추상 클래스 (순수 가상 함수)
{
};

struct Derived : Base // 오버라이딩 O => 구체 클래스
{
  void Foo() { } // overriding
};
 
Base temp; // 컴파일 오류! Base는 추상 타입
Derived d; // OK. Derived는 구체 타입

추상 클래스 ( 순수 가상 함수 ) 는 하위 타입으로 하여금 오버라이딩을 강제한다.

 

 

728x90

'Program > C (C++,C#)' 카테고리의 다른 글

[C++] 리스트  (0) 2022.06.21
[C++] 동적 할당  (0) 2022.06.15
자료구조와 알고리즘  (0) 2022.06.07
[C++] Class 상속  (0) 2022.06.02
[C++] Class 기본 함수  (1) 2022.06.02

+ Recent posts