2011-05-01 5 views
1

일부 순수 C++ 텍스트를 읽는 중입니다.C++의 순수 가상 함수에 관한 질문?

virtual void virtualfunctioname() = 0; 

그리고 텍스트 설명 : 텍스트가 말한대로, 순수 가상 함수 선언의 형태는, 예를 들면, "순수 가상 함수가 시체가 없기 때문에, 프로그래머가 선언에 대한 표기법 = 0을 추가해야합니다 기본 클래스의 순수 가상 함수. "

나는 만을 선언하고 모든 것이 정상적으로 작동 함을 의미하므로 = 0;을 제거하려고 시도했습니다.

그럼 왜 가상 함수에 0을 할당해야합니까? 감사합니다

답변

2

클래스에 인 경우 순수 가상 함수이 인스턴스화 될 수 없습니다. 또한 파생 클래스가 이러한 함수를 구현하도록 강제합니다. 그렇지 않으면 인스턴스화 할 수 없습니다.

따라서 = 0을 제거하면 인스턴스화 될 수있는 일반 기본 클래스 만 있고 해당 파생 클래스에는 인터페이스가 적용되지 않습니다. 기본 클래스 개체 (또는 재정의가없는 파생 클래스 개체)를 인스턴스화 한 다음 virtualfunctionname()을 호출하려고하면 정의가 없으므로 문제가 발생합니다. 따라서 링커는 불평 할 것입니다.

[ "순수 가상 함수에 본문이 없음"이라는 주장도 잘못되었습니다. 순수 가상을위한 구현을 정의 할 수 있습니다. 이 클래스는 여전히하지만, 추상적 인 것입니다.]

+0

그러나 클래스는 여전히 추상으로 간주되므로 인스턴스화 할 수 없습니다. –

+0

@the_drow : 어떤 상황을 언급하고 있습니까? 순수 가상 함수가없는 클래스는 인스턴스화 될 수 있습니다 (생성자/소멸자가 public이라고 가정). –

+1

본문이있는 순수 가상 함수를 참조하고 있습니다.클래스 자체는 여전히 추상적이며 파생 클래스는 "기본"구현을 갖습니다. –

0

일이 잘

근무 난 당신이 코드를 컴파일 및 링크 된 것을 의미 가정합니다. 그러나 선언 한 기본 클래스에 virtualfunctionname의 구현을 정의하지 않았으므로 기본 구현을 호출하면 링커 오류가 발생합니다.

파생 된 클래스에서 구현을 제공하고이를 대신 사용하기 때문에 상황이 정상적으로 작동 할 수 있습니다.

+0

가상 메서드가 포함 된 클래스에서 파생 된 개체를 인스턴스화하려고하면 링커 오류가 발생합니다. 그렇지 않으면, 가상 클래스를 호출 할 때 기본 클래스에 캐스트하면 어떻게됩니까? –

1

메서드를 순수 가상으로 선언하지 않으면 컴파일러는 어딘가에 메서드가 있다고 가정합니다. 순수 가상 클래스 (및 적절한 용어를 사용하는 추상 클래스)가 포함될 것으로 예상되는 클래스를 인스턴스화하지 않는다면 괜찮을 것입니다. 그러나 그렇게하면 컴파일러에서 코드를 유효한 것으로 받아들이고 나중에 링커 오류가 발생합니다.

메소드를 순수 가상으로 표시하면 해당 메소드를 포함하는 클래스는 추상으로 표시되고 컴파일러는이를 인스턴스화하려는 모든 시도를 거부합니다.

0

함수를 순수 가상 함수로 선언하면이를 포함하는 클래스를 추상 클래스라고하며 인스턴스가 만들어지지 않습니다. 다시이 클래스의 인스턴스는 생성되지 않습니다.이 클래스는 상속에 사용되며 파생 클래스는이 메서드를 구현해야합니다. 그렇지 않으면 컴파일 오류가 나타납니다. 감사합니다

관련 문제