2014-10-28 2 views
-2

이 상황을 고려하십시오. 클래스 BaseClass는 x() 및 y() 함수를 정의합니다. x()는 y()를 호출합니다.파생 된 객체가 파생 클래스에서 재정의 된 함수를 호출하지 않는 이유는 무엇입니까?

클래스 DerivedClass는 BaseClass에서 상속 받고 함수 y()를 다시 정의합니다.

클래스 DerivedClass의 개체 D가 만들어지고 함수 x()가 호출됩니다.

y()가 사용 된 x()가 호출되면 BaseClass에 정의 된 것이나 DerivedClass에서 재정의 된 것입니까?

개체 D는 BaseClass로
기능 X의 기능 X를()() DerivedClass

함수 호출 함수 Y() (Y를 기능 BaseClass로와하지가) 컴파일 타임에 바인딩 된 호출 호출합니다.
정적 바인딩입니다.

왜 나는 그 문제가 명확하지 않습니다. 함수 X가 (객체 D에 의해) 호출되고 객체 D가 파생 클래스 인 경우 재 정의 된 클래스의 D.Y()를 호출하지 않습니까?

이것은 제가 감각을 없애려고 노력하고있는 샘플입니다.

baseClass 
void x(); // calls y(); 
void y(); 


derivedClass 
void y(); 

main() 
derivedClass D; 
D.x(); 
+1

코드에 예제를 표시 할 수 있습니까? 코드에 대한 설명을 읽는 것보다 코드를 읽는 것이 더 쉽습니다. – Brian

+0

나는 코드를 추가했습니다. – YelizavetaYR

+1

이것은 C++ 코드가 아닙니다. 작동 예제를 제공하십시오 –

답변

2

내 C++ 녹슨입니다,하지만 난 한번 풀어주지 :

yBaseClass에서의 정의에 가상했을 경우

class BaseClass 
{ 
public: 
    void x() { 
     this->y(); 
    } 

protected: 
    void y() { 
     /* do stuff */ 
    } 
}; 

class DerivedClass : public BaseClass 
{ 
protected: 
    void y() { 
     /* do different stuff */ 
    } 
}; 


int main() { 
    DerivedClass d; 
    d.x(); 
} 

다음, 다음은 당신의 코드가되어 있어야합니다

DerivedClass::yd.x() (여기서 dDerivedClass 인스턴스 임)을 호출 할 때 호출됩니다. y 가상 수 있도록하기 위해

, 그래서 같이 virtual 키워드를 사용

virtual void y() { /* do stuff */ } 

y 경우는 대신 x에 의해 호출되는 BaseClass::y이다 BaseClassvirtual 키워드를 사용하여 정의되어 있지 않습니다. d.BaseClass::y(), 귀하의 경우 확실히 DerivedClassx을 무시하지 않고 가능하지 않을 것이다 : 파생 클래스의 인스턴스에서 재정의 된 기본 클래스의 가상 메소드를 호출하기 위해

, 하나는 완전한 메소드 이름을 사용해야합니다.

문제점을 잘 이해하고 있습니까?

0

개체의 정적 유형이 (D) 인 경우 D::y이 호출됩니다. BaseClass에 정적 유형 (참조)이 있으면 BaseClass:y이 호출됩니다. 그것은 아주 간단합니다.

관련 문제