구현 된 순수 가상 기능 virtual void f() =

내 기본 이해는 순수한 가상 기능에 대한 구현이 없다는 것입니다. 그러나 순수한 가상 기능에 대한 구현이있을 수 있다고 들었습니다.

class A {
public:
    virtual void f() = 0;
};

void A::f() {
    cout<<"Test"<<endl;
}

위의 코드가 정상입니까?

구현으로 순수한 가상 기능을 만드는 목적은 무엇입니까?



답변

순수 virtual함수는 직접 인스턴스화 할 파생 유형으로 구현해야하지만 기본 유형은 여전히 ​​구현을 정의 할 수 있습니다. (호출하여 완벽한 범위의 이름을 사용하여 (액세스 권한을 허용하는 경우) 파생 클래스는 명시 적으로 기본 클래스 구현을 호출 할 수 있습니다 A::f()– 경우의 예에서 A::f()있었다 public또는 protected). 다음과 같은 것 :

class B : public A {

    virtual void f() {
        // class B doesn't have anything special to do for f()
        //  so we'll call A's

        // note that A's declaration of f() would have to be public 
        //  or protected to avoid a compile time problem

        A::f();
    }

};

내가 생각할 수있는 유스 케이스는 다소 합리적인 기본 동작이있을 때이지만 클래스 디자이너는 기본 정렬 동작이 명시 적으로 만 호출되기를 원합니다. 파생 클래스가 항상 자체 작업을 수행하지만 공통된 기능 집합을 호출 할 수도 있습니다.

언어에 의해 허용되지만, 내가 일반적으로 사용하는 것으로 보이는 것은 아닙니다 (그리고 그것을 할 수 있다는 사실은 대부분의 C ++ 프로그래머, 심지어 경험이 많은 프로그래머를 놀라게하는 것처럼 보입니다).


답변

분명히, 당신은 무엇을 오해하고 있습니다 = 0; 가상 기능 후 의미합니다.

= 0은 파생 클래스가 구현을 제공해야한다는 것을 의미하며 기본 클래스가 구현을 제공 할 수는 없습니다.

실제로 가상 함수를 순수 (= 0)로 표시하면 누군가가 Base :: Function (…)을 통해 명시 적으로 수행하지 않는 한 또는 호출되지 않기 때문에 정의를 제공 할 때 아무런 의미가 없습니다. 기본 클래스 생성자는 해당 가상 함수를 호출합니다.


답변

이 방법의 장점은 파생 형식이 여전히 메서드를 재정의하지만 기본 또는 추가 구현을 제공한다는 것입니다.


답변

파생 클래스에서 실행해야하는 코드가 있지만 직접 실행하지 않으려는 경우 강제로 재정의하려는 경우

코드는 정확하지만 모든 것이 자주 사용되는 기능은 아니지만 일반적으로 순수한 가상 소멸자를 정의하려고 할 때만 나타납니다.이 경우 구현을 제공 해야 합니다. 재미있는 점은 일단 그 클래스에서 파생되면 소멸자를 재정의 할 필요가 없다는 것입니다.

따라서 순수한 가상 함수의 현명한 사용법은 순수한 가상 소멸자를 “최종”키워드로 지정하는 것입니다.

다음 코드는 놀랍도록 정확합니다.

class Base {
public:
  virtual ~Base() = 0;
};

Base::~Base() {}

class Derived : public Base {};

int main() { 
  // Base b; -- compile error
  Derived d; 
}


답변

예를 들어 순수한 가상 소멸자에게 몸을 주어야합니다 🙂

읽기 : http://cplusplus.co.il/2009/08/22/pure-virtual-destructor/

(링크 끊기, 아카이브 사용)


답변

네 맞습니다. 예제에서 A에서 파생 된 클래스는 인터페이스 f ()와 기본 구현을 모두 상속합니다. 그러나 파생 클래스가 f () 메소드를 구현하도록 강제합니다 (A에서 제공하는 기본 구현 만 호출하더라도).

Scott Meyers는 Effective C ++ (제 2 판) 항목 # 36에서이를 설명합니다. 인터페이스 상속과 구현 상속을 구분합니다. 최신 버전에서 품목 번호가 변경되었을 수 있습니다.


답변

본문이 있거나없는 순수한 가상 함수는 파생 된 형식이 자체 구현을 제공해야 함을 의미합니다.

기본 클래스의 순수 가상 함수 본문은 파생 클래스가 기본 클래스 구현을 호출하려는 경우 유용합니다.