18.7 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인 클래스를 말한다. 다시 말해 이 클래스는 순전히 형태만 정의하고 구현은 하지 않는 것이다.
인터페이스는 파생 클래스가 구현해야 하는 기능을 정의하려는 경우에 유용하지만 파생 클래스가 해당 기능을 구현하는 방법에 대한 세부 사항은 전적으로 파생 클래스에 맡겨야 합니다.
Author And Source
이 문제에 관하여(18.7 Pure virtual functions, abstract base classes, and interface classes), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ikmy0ung/18.7-Pure-virtual-functions-abstract-base-classes-and-interface-classes저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)