2012-10-03 1 views
0

어떻게 내부 컴파일러가 wheather 클래스가 추상 (우리는 객체를 생성 할 수없는)이라는 것을 식별합니까?C++에서 컴파일러가 클래스를 추상화 할 수 있는지 여부를 설명 할 수 있습니까?

+0

클래스에 최소한 하나의 순수 가상 함수가 있으면 추상이라고 말할 수 있습니다. 컴파일러가 이것을 어떻게 확인하고 있는지 설명해주십시오. –

+1

"* 컴파일러가 이것을 어떻게 식별하고 있는지 설명해주십시오. *"컴파일러가 클래스 정의를 식별하는 것과 같은 방법은 C++ 문법을 따르는 것입니다. 나는 그 이상의 질문을 이해하지 못한다. 컴파일러는 C++을 컴파일하고 C++은 순수 가상 함수 선언이 무엇인지 정의합니다. –

+1

"컴파일러에 달려있다"는 대답은 이것뿐입니다. 표준은 컴파일러가이 작업을 수행하는 방식을 지정하지 않습니다. – juanchopanza

답변

0

컴파일러는 클래스 또는 클래스에서 파생 된 클래스의 순수 가상 함수를 검사 할만큼 똑똑합니다.

클래스 자체가 순수 가상 함수 [Ref 1]을 정의하면 함수 본문을 정의하는지 여부와 관계없이 추상 클래스로 플래그됩니다.

클래스가 순수 가상 함수를 사용하여 클래스를 상속하는 경우 이 순수 가상 함수에 대한 정의를 제공해야합니다. 추상으로 플래그가 지정되지 않은 경우.

[참고 1]

virtual void doSomething() = 0; 
          ^^^^^ 

P.S : 예 순수 가상 함수가 정의를 할 수 있습니다.

1

추상 클래스에는 하나 이상의 순수 가상 함수가 포함됩니다. 그것의, 추상 클래스의 정의에 경우이에서 파생 오버라이드 (override)하지 않는이

virtual void foo() = 0; 

모든 클래스와 같은 뭔가가이 같은 기능은 정의를 검사하고보고함으로써 추상적 인

0

될 것입니다 코스. 이게 또 어떻게 될까요?

+1

"이게 또 어떻게 될까요?" "추상"클래스의 C++ 정의는 C++에만 해당되며 표준에 깊이 숨겨져 있습니다. 물론 C++ 방식 만이 유일한 방법은 아닙니다. '추상적'키워드. C++에만 국한된 것은 적어도 하나의 public 생성자가 존재하는지 테스트하는 것입니다. 하나 이상의 public 생성자가없는 클래스의 인스턴스는 만들 수 없습니다. 그것은 내 눈의 추상 클래스이지만 C++의 눈에는 아닙니다. –

+0

@DavidHammen : C++에 관한 질문을 할 때 C++ 방식이 유일한 방법입니다 *. 다른 방법은 정의에 의한 것이기 때문에 C++이 아닙니다. –

+0

@ NicolBolas : C++ 정의를 이해합니다. 'is_default_constructible'은 C++ 98/03에서 제대로 작동하지 않기 때문에 이것은 단지 애호가입니다. C++ 11이 가까운 장래에 오프 - 리미트가되는 복합체 ... –

0

클래스의 멤버 중 하나 이상이 추상 클래스는 추상 클래스입니다. 따라서 클래스에 하나 이상의 순수 가상 함수가 포함되어 있으면 컴파일러 관점에서 추상입니다.

virtual void PureVirtualMethod() = 0; // Any class that has methods 
             // with such declaration is abstract. 
관련 문제