가상 함수와 순수한 가상 함수의 차이점
가능한 중복 :
C ++ 가상 / 순수 가상 설명
순수한 가상 함수와 가상 함수의 차이점은 무엇입니까? "순수한 가상 기능은 본문이없는 가상 기능입니다"라는 것을 알고 있지만 이것이 의미하는 바는 무엇이며 실제로 아래 행에 의해 수행되는 작업은 무엇입니까?
virtual void virtualfunctioname() = 0
가상 함수는 클래스를
다형성 기본 클래스로
만듭니다. 파생 클래스는 가상 함수를 재정의 할 수 있습니다. 기본 클래스 포인터 / 참조를 통해 호출 된 가상 함수는 런타임에 해결됩니다. 즉, 정적 유형 대신 객체 의
동적 유형
이 사용됩니다 .
Derived d;
Base& rb = d;
// if Base::f() is virtual and Derived overrides it, Derived::f() will be called
rb.f();
순수한 가상 함수는 선언이 다음과
=0
같이 끝나는 가상 함수입니다 .
class Base {
// ...
virtual void f() = 0;
// ...
순수 가상 함수는 암시 적으로 클래스 를 명시 적으로 선언하는 키워드가있는 Java와 달리
추상적
으로 정의 된 클래스를 만듭니다 . 추상 클래스는 인스턴스화 할 수 없습니다. 파생 클래스는 상속 된 모든 순수 가상 함수를 재정의 / 구현해야합니다. 그렇지 않으면 추상적이 될 것입니다.C ++의 흥미로운 '기능'은 클래스가 구현 된 순수한 가상 함수를 정의 할 수 있다는 것입니다. (
있습니다.)
C ++ 11 은 순수 가상 함수의 구문과 유사한
delete
and
default
키워드를 새롭게 사용했습니다 .
my_class(my_class const &) = delete;
my_class& operator=(const my_class&) = default;
참조
와
의 사용에 대한 자세한 정보
delete
와
default
.
가상 함수의 경우 기본 클래스에서 구현을 제공해야합니다. 그러나 파생 클래스는 자체 구현으로이 구현을 대체 할 수 있습니다. 일반적으로 순수한 가상 함수의 경우 구현이 제공되지 않습니다.
=0
함수 선언이 끝나면 함수를 순수 가상으로 만들 수 있습니다 . 또한 순수한 가상 함수를 포함하는 클래스는 추상적입니다. 즉이 클래스의 객체를 만들 수 없습니다.
순수한 가상 함수는 일반적으로 기본 클래스에서 구현되지는 않지만 리프 하위 클래스에서 구현되어야합니다.다음과 같이 선언에 "= 0"을 추가하여 해당 사실을 나타냅니다.
class AbstractBase
{
virtual void PureVirtualFunction() = 0;
}
그런 다음 순수한 가상 함수를 구현하지 않으면 서브 클래스를 선언하고 인스턴스화 할 수 없습니다.
class Derived : public AbstractBase
{
virtual void PureVirtualFunction() override { }
}
override
컴파일러는 키워드 를 추가하여 동일한 서명을 가진 기본 클래스 가상 함수가 있는지 확인합니다.
실제로 C ++에서
할 수 있습니다 . 유일한 차이점은 클래스를 인스턴스화하기 전에 모든 순수 가상 함수를 파생 클래스로 구현해야한다는 것입니다.참고 URL :
'Programming' 카테고리의 다른 글
CMake를 사용하여 포함 디렉토리를 올바르게 추가하는 방법 (0) | 2020.05.09 |
---|---|
클래스의 함수 선언 후 "default"는 무엇을 의미합니까? (0) | 2020.05.09 |
빌드를 실행할 때 IntelliJ 절단 출력을 중지하는 방법은 무엇입니까? (0) | 2020.05.09 |
파이썬 쉘에서 현재 디렉토리를 알고 / 변경하는 방법? (0) | 2020.05.09 |
Xcode 8 Beta 3 레거시 스위프트 사용 문제 (0) | 2020.05.08 |