18.7 Pure virtual functions, abstract base classes, and interface classes

주홍영·2022년 3월 21일
0

Learncpp.com

목록 보기
178/199

https://www.learncpp.com/cpp-tutorial/pure-virtual-functions-abstract-base-classes-and-interface-classes/

Pure virtual (abstract) functions and abstract base classes

우리가 이제껏 사용했던 모든 virtual function은 body가 존재했다 (definition)
그러나 c++은 pure virtual function이라는 특별한 종류의 함수를 만드는 것을 허용한다
이는 body가 없다. 이는 간단하게 placeholder로 역할한다고 보면된다

pure virtual function을 만드는 것은 body가 아닌 0을 assign하면 된다

class Base
{
public:
    const char* sayHi() const { return "Hi"; } // a normal non-virtual function

    virtual const char* getName() const { return "Base"; } // a normal virtual function

    virtual int getValue() const = 0; // a pure virtual function

    int doSomething() = 0; // Compile error: can not set non-virtual functions to 0
};

위의 예시에서 virtual int getValue() const = 0;
이라고 되어 있다. 이게 pure virtual function을 설정하는 방법이다

이는 구체적인 implementation은 모두 derived class에게 맡긴다는 것이다

pure virtual function을 쓴다는 것은 두 가지 주요한 결과를 낳는다
하나는 pure virtual function을 하나라도 설정하면 그 클래스는 abstract base class로 instantiate이 불가능하다는 것이다
두번째로는 어떠한 derived class는 반드시 pure virtual function의 body를 define해야한다는 것이다

Pure virtual functions with bodies

pure virtual function으로 설정해 childe class에서 무조건 redefine을 강제하고 싶지만
default functionality를 부여하고 싶을 때 pure virtual function에 body를 부여할 수 있다
단 이때에도 instantiate은 불가능하다

#include <string>
#include <iostream>

class Animal // This Animal is an abstract base class
{
protected:
    std::string m_name;

public:
    Animal(const std::string& name)
        : m_name(name)
    {
    }

    const std::string& getName() const { return m_name; }
    virtual const char* speak() const = 0; // note that speak is a pure virtual function

    virtual ~Animal() = default;
};

const char* Animal::speak() const
{
    return "buzz"; // some default implementation
}

class Dragonfly: public Animal
{

public:
    Dragonfly(const std::string& name)
        : Animal{name}
    {
    }

    const char* speak() const override// this class is no longer abstract because we defined this function
    {
        return Animal::speak(); // use Animal's default implementation
    }
};

int main()
{
    Dragonfly dfly{"Sally"};
    std::cout << dfly.getName() << " says " << dfly.speak() << '\n';

    return 0;
}

위 처럼 사용가능하다
만약 Animal object를 만들려고 한다면 abstract base class로 제한되며 error가 발생한다

Interface classes

Interface class란 member variable은 존재하지 않고 모든 member function이 pure virtual function인 클래스를 말한다. 다시 말해 이 클래스는 순전히 형태만 정의하고 구현은 하지 않는 것이다.
인터페이스는 파생 클래스가 구현해야 하는 기능을 정의하려는 경우에 유용하지만 파생 클래스가 해당 기능을 구현하는 방법에 대한 세부 사항은 전적으로 파생 클래스에 맡겨야 합니다.

profile
청룡동거주민

0개의 댓글