2013-03-04 2 views
0

약간의 다형성을 알고 있지만 여기서 암시 적 변환 인 경우 B에서 A으로 암시 적 변환 할 때 B에서 메서드가 호출되지만 명시 적 메서드는 A 메서드가 가상 인 경우에만이 방법으로 작동하며, 그렇지 않은 경우 ShowA이 입력됩니다 (클래스 A의 메서드가 호출 됨). A& extra = extra이 금지 또는 단순히 금지 무의미한 것들에 약간의 중요성이 있기 때문에하지 않는 이유는 또한명시 적 변환과 가상 함수를 사용한 참조를 사용하는 암시 적

class A 
{ 
public: 
    A(){}; 
    ~A(){} 
public: 
    int n; 
     virtual void Show(){ cout << "ShowA" << endl; }; 
}; 

class B : public A 
{ 
public: 
    B(){}; 
    ~B(){} 
    virtual void Show() { cout << "ShowB" << endl; } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    B b; 
    A& a = b; //ShowB 
    A& a = (A)b; //ShowA 
    a.Show(); 

    //Extra: 
    A& extra = extra; 

    return 0; 
} 

가?

+0

그래서 ... 질문은 무엇입니까? – Yaniv

답변

2
A& a = (A)b; 

b의 기본 클래스 부분을 복사, 유형 A의 임시 객체를 생성합니다. 그런 다음이 임시 참조를 가져옵니다.

운좋게도 C++ 언어는 실수로 이런 종류의 실수를하지 않도록 일시적인 (비정규적인) 참조를 허용하지 않습니다.

불행히도 컴파일러는이를 수행 할 수있는 "언어 확장"기능을 제공하므로 컴파일러를 사용해야하는 경우 더욱주의해야합니다.

일반적으로 전염병과 같은 C 스타일의 캐스트는 피하십시오. 명시 적 변환이 필요하면 컴파일러가 오류를 잡는 데 도움이되는 가장 제한적인 C++ 스타일 캐스트를 사용하십시오.

또한 A& extra = extra이 금지되지 않은 이유가 있습니까? 아니면 금지 된 무의미한 것의 중요성이 거의 없기 때문입니까?

허용 할만한 이유가 없습니다. 아마도 합법적 인 선언을 금지하지 않고는 금지하지 않기 때문에 금지되지 않았습니다. int i, &r=i; 또는 void *p = &p;

+0

우수 답변, 감사합니다. 마이크! –

관련 문제