2011-08-22 3 views
2

상속과 별도로 클래스의 기능을 가상으로해야하는 다른 이유는 무엇입니까?cpp 상속 질문

기본 클래스가 상속되고 파생 클래스가 기본 클래스 함수를 거의 구현하지 않고 제 3 클래스가 가상 클래스로 정의 된 정의되지 않은 메서드를 호출하는 런타임 중에 어떤 일이 발생합니까? 또는 기본 클래스 함수를 호출 할 것인가?

파생 클래스에서 기본 클래스의 모든 함수를 정의하고 싶지만 필요한 상속을 그대로 유지하려면 어떻게해야합니까?

답변

3

상속과 별도로 어떤 클래스에서 가상으로 기능을 수행해야하는 이유는 무엇입니까?

상속을 취급하지 않는 경우 virtual 기능을 사용하는 데 합당한 사용법은 없습니다. 둘 다 서로를 의미합니다. 기본 클래스를 상속하고 파생 클래스는 기본 클래스의 기능과 세 번째 클래스의 몇 가지 구현하지 않는 경우 실행 시간 동안 어떻게됩니까

는 호출하는 기본 가상 로 정의됩니다 정의되지 않은 방법. 또는 기본 클래스 함수를 호출 할 것인가?

파생 클래스는 모든 몸의 virtual 기능에 대한 선언을하지 않으면

은, 다음 (즉시) 기본 클래스 virtual 기능은 파생 클래스 객체라고합니다. 반면에 파생 클래스에서 virtual이라는 함수를 선언했지만 정의하지 않으면 링커 오류가 발생합니다. 세분화 오류가 없습니다.

내 파생 클래스에 내 기본 클래스의 모든 기능을 정의하고 싶지만 아직 장소에서 필요한 상속이없는 경우 어떻게해야합니까?

비록 이것이 명확하지는 않지만, 파생 클래스에서 virtual 함수 (원하지 않는)를 선언/정의하지 않아도됩니다. 기본 클래스 virtual 함수를 사용합니다.

+0

당신이 대답 한 마지막 질문과 관련하여, 내부적으로 만 실행되는 기능이라면 개인을 비공개로 설정하여 상속받지 못하게 할 수 있습니까? – Rhexis

+0

@Flyphe, no. 액세스 지정자는 상속 된 (즉, 재정의 된) 함수를 금지 할 수 없습니다. 여전히 무시할 수 있습니다.그리고 내부적으로 (파생 된 클래스 객체로) 함수가 호출되면 여전히 오버라이드 된 함수로 해석 될 수 있습니다. [데모보기] (http://www.ideone.com/3XmWL). – iammilind

+0

개인 변수와 함수를 상속 할 수 있습니까? 그 때 보호 한 점은 무엇입니까? – Rhexis

0

virtual 메서드를 다시 구현하지 않으면 호출자가 기본 클래스를 호출합니다. 이것은 상속을 사용하는 것과 같은 일종의 IMO입니다. 당신이 기본 클래스는 가상 메소드를 구현하지 않으려면

, 당신은 다음과 같이 선언 할 수 있습니다

class Demo { 
    void foo() = 0; 
}; 

이 추상 클래스라고합니다 것입니다. 이러한 클래스의 인스턴스는 만들 수 없습니다.. Demo에서 상속 한 클래스는 모두 foo()을 구현해야하며, 추상 클래스이기도하므로 어쩔 수 없다.