업데이트:

태그: ,

카테고리:



순수 가상함수, 추상클래스, interface 클래스

기초 클래스에서 순수 가상함수를 선언하면 기초클래스에 해당 함수의 몸체부분이 정의되지 않으므로, 유도 클래스에서 해당 함수를 오버로딩해 구현이 강제된다.
이렇게 순수 가상함수가 1개라도 있는 클래스를 추상 클래스라고 부른다. 혹은, 순수 가상 클래스라고도 부른다.

근데, 추상 클래스로 기초클래스를 구현한다고 한들, 명시적으로 해당 클래스의 어떤 메서드를 구현해야하는지 파악을 해야하는데, interface 클래스의 의의는 여기있다.

  • 클래스의 모든 멤버함수를 순수 가상함수로 구현한다.
  • 물론, 소멸자에도 virtual 키워드를 붙여줘야한다.

이렇게 선언된 interface 클래스는 헤더파일만 보고 해당 클래스가 객체를 생성하지않고, 유도클래스에게 interface를 제공하는 역할만한다는 것을 알 수 있어 가독성에 이점이 있다.
interface 클래스를 상속하는 모든 유도 클래스는

  • 객체를 생성하기 위해선 interface 클래스가 제공하는 interface(순수가상함수)를 구현해야하고,
      #include <iostream>
      #include <string>
    
      class Interfaces
      {
          public:
              virtual ~Interfaces(void);
          public:
              virtual void InterfacesFnc(void) const = 0;
      };
    
      class Derived : public Interfaces
      {
          private:
              std::string *test;
          public:
              Derived(void);
              ~Derived(void);
          public:
              void InterfacesFnc(void) const;
      };
    
      Derived::Derived(void) : Interfaces()
      {
          this->test = new std::string[10];
      }
    
      void Derived::InterfacesFnc(void) const
      {
          std::cout<<"test"<<std::endl;
      }
    
      Derived::~Derived(void)
      {
          delete []this->test;
      }
    
      int main(void)
      {
          Derived obj1;
    
          return (0);
      }
    
  • 다른 유도클래스의 추상클래스가 된다면 일부만을 구현하고, 추상클래스로서의 역할만을 할수도 있다.
      #include <iostream>
      #include <string>
    
      class Interfaces
      {
          public:
              virtual ~Interfaces(void);
          public:
              virtual void InterfacesFnc(void) const = 0;
      };
    
      class Derived : public Interfaces
      {
          private:
              std::string *test;
          public:
              Derived(void);
              ~Derived(void);
          public:
              void InterfacesFnc(void);
      };
    
      Derived::Derived(void)
      {
          this->test = new std::string[10];
      }
    	
      /*
      void Derived::InterfacesFnc(void) const
      {
          std::cout<<"test"<<std::endl;
      }*/
    
      Derived::~Derived(void)
      {
          delete []this->test;
      }
    
      int main(void)
      {
          Derived obj1();//Derived 클래스는 InterfacesFnc를 구현하지 않아서 추상클래스로 역할이된다.
    
          return (0);
      }
    

기초 클래스를 디자인한 개발자와 해당 클래스를 사용하는 사용자간에 이런 계약을 체결하게된다.



댓글남기기