2014-06-16 3 views
3

을 파견 :공변 반환 형식 내가이 간단한 프로그램에 의해 혼란 스러워요

#include <iostream> 

using namespace std; 

struct Base { 
    virtual ~Base() {} 
    virtual Base* concrete() { cout << "concrete returning base - "; return this;} 
    void stat() { cout << "I'm a BASE\n";} 
}; 

struct Derived: Base { 
    Derived* concrete() override { cout << "concrete returning derived - "; return this;} 
    void stat() { cout << "I'm a DERIVED\n";} 
}; 


int main() { 
    Base * bd = new Derived; 
    bd->stat(); // prints: "I'm a BASE" 
    bd->concrete()->stat(); //prints: "concrete returning derived - I'm a BASE" 

    delete bd; 
    return 0; 
} 

왜 마지막 줄에 인쇄 concrete returning derived - I'm a DERIVED합니까? 무슨 일 이니? 당신은 공변 반환 형식의 유틸리티를 오해하고

답변

4

... 그것은 호출 컨텍스트 그것이 Derived 타입 객체를 다루는 것 알고있는 경우에 차기 : 귀하의 경우

Derived d; 
d->concrete()->stat(); 

, concrete은에라고 a Base* 그래서 다형성으로 전달되고 Derived*을 반환하더라도 해당 포인터는 호출 컨텍스트에서 Base*으로 처리되며 stat()으로 정적 디스패치를 ​​결정하는 것은 Base* 정적 유형입니다.

관련 문제