2013-06-13 5 views
4

다음 코드를 작성했습니다.여러 레벨을 가진 추상 클래스

#include <iostream> 

using namespace std; 

class CI 
{ 
public: 
virtual void display() =0; 
}; 


class Inter: public CI 
{ 
public: 
    int parseData (int); 
}; 

Inter::parseData (int data) 
{ 
    cout <<"Parsing the data "<<data; 
    return data*100; 
} 



class Last: public Inter 
{ 
public: 
    void display(); 
}; 

void Last::display() 
{ 
    cout <<" Last:: Displaying From Last "<<endl; 
} 

class USB: public Inter 
{ 
public: 
    void display(); 
}; 


void USB::display() 
{ 
    cout <<" USB:: Displaying From Last "<<endl; 
} 
int main (int argc, char ** argv) 
{ 
    int temp; 
    CI *obj = new Last; 

    obj->display(); 
    temp = obj->parseData (100); 
    cout <<"Parsed DAta .. "<<temp<<endl; 
    delete obj; 

    obj = new USB; 
    obj->display(); 
    temp = obj->parseData (200); 

} 

내 질문은 :

이유는>를 OBJ 호출 할 수 parseData 기능 아니에요? 내 이해에 따라 클래스 '마지막'및 'USB'는 '인터'클래스에서 파생되므로 올바른 호출 가능해야합니다 ... ..

제 이해가 잘못 된 부분을 자세히 알려주십시오.

+1

아니오 obj가 유형 CI이고 parseData가 가상이 아니기 때문에 이는 CI 클래스 – sethi

+1

에서만 parseData 구현을 찾습니다. 메소드를 사용할 수있게하려면 선언 된 수준의 포인터를 사용해야합니다. 'parseData'는'CI'에서 선언되지 않았습니다. – StoryTeller

답변

4

objLast *로 선언, 또는 적어도 Inter *

Inter *obj = new Last; 

또는

Last *obj = new Last; 

obj 그냥 CI * 경우

해야, 컴파일러는 개체가합니다 ( parseData() 방법을 볼 수 없습니다 마지막으로 인스턴스화되었지만 즉시 암시 적으로 CI로 변환되고 메서드의 이점을 잃어 버립니다).

upcast의 의미를 찾으시는 것이 좋습니다. (implicit conversionhere 또는 그 외 참조) ...

1

CI에 없습니다. parseData()이 만들어 지더라도 virtual은 여전히 ​​발견되지 않습니다. 가상 함수는 기본 클래스의 비헤이비어 만 재정의하지만 이러한 함수를 호출하는 것은 이미 이러한 함수가있는 클래스에 대한 포인터를 통해서만 가능하다는 점을 기억하십시오. 계층 구조에서 인터페이스에 parseData()이있는 첫 번째 클래스는 Inter입니다.

그래서 당신이 Inter*으로 obj을 정의 할 수 있습니다 중 하나, 그것을 해결하기 위해, 또는 당신은 또한 parseData의 호출 사이트에서 Inter*에 캐스팅 할 수있다. 전자가 바람직하다.

int main (int argc, char ** argv) 
{ 
    int temp; 
    Inter *obj = new Last; 

    obj->display(); 
    temp = obj->parseData (100); 
    cout <<"Parsed DAta .. "<<temp<<endl; 
    delete obj; 

    obj = new USB; 
    obj->display(); 
    temp = obj->parseData (200); 

} 

Live Example.

+0

'CI' 클래스는'virtual'인지 여부에 관계없이'parseData()'메소드를 가지고 있지 않습니다. 그리고 타입 캐스팅은이 상황에서 좋은 방법이 아닙니다. 가능하면 피하는 것이 좋습니다. 여기서 포인터'obj'에'Inter' 타입을 사용하는 것이 더 좋습니다. – SpongeBobFan

+0

@SpongeBobFan 감사합니다. 귀하의 요점을 반영하여 답변을 업데이트했습니다. – TemplateRex

관련 문제