2013-11-23 2 views
3

추상 기본 클래스의 파생 클래스가 있다고 가정 해 보겠습니다. 추상 기본 클래스에 대한 포인터는 main에서 선언되고 "new"를 통해 파생 클래스에 할당됩니다. 파생 클래스의 멤버 함수가 아니라 파생 클래스의 개체가 아닌 기본 클래스에 대한 포인터에서 어떻게 파생 클래스의 멤버 함수에 액세스합니까?다형성 : 파생 클래스 멤버 함수에 어떻게 액세스합니까?

예 :

#include <iostream> 
using namespace std; 

class clsStudent 
{ 
public: 
    virtual void display() = 0;// {cout<<"Student\n";} 
}; 

class clsInternational : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void passportNo(){cout<<"Pass\n";} 
}; 

class local : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void icNo(){cout<<"IC\n";} 
}; 


int main() 
{ 
    clsStudent * s = new clsInternational; 
    clsStudent * s2 = new local; 

    s->display(); 
    s->passportNo(); //This won't work 

    return 0; 
} 
+2

. 파생 클래스 함수에 액세스하려면 포인터를 파생 형식으로 캐스트해야합니다. –

+0

'passNo()'함수는'clsInternational','local','clsStudent' 클래스에 정의되어 있지 않습니다. 오타입니까? 그렇다면 무엇이어야 하는가? – Oswald

+0

@Oswald s-> passportNo() 인 것 같아서 죄송합니다. – user3025784

답변

7

건방진 대답 : 그렇지 않습니다. 내 말은, 당신이 정말로 필요하다면 기술적 인 질문에 대한 대답은 C++에서 dynamic_cast 연산인데, "downcast"(기초에서 파생 클래스로 캐스트)를 수행하기 위해서입니다.

하지만 뒤로 물러나는 것은 가상 함수에 대한 합리적인 사용 사례입니다. 스스로에게 물어보십시오. 내가 접근하고 싶은 일반적인 의미는 무엇입니까?

이 경우 모든 학생에게 식별 번호가 필요합니다.

근무 소스 코드 : 다형성의 전체 아이디어에 반하는 http://ideone.com/5E9d5I

class clsStudent 
{ 
public: 
    virtual void display() = 0;// {cout<<"Student\n";} 
    virtual void identifyingNumber() = 0; 
}; 

class clsInternational : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void identifyingNumber(){cout<<"Pass\n";} 
}; 

class local : public clsStudent 
{ 
public: 
    void display(){cout<<"Local\n";} 
    void identifyingNumber(){cout<<"IC\n";} 
}; 


int main() 
{ 
    clsStudent * s = new clsInternational; 
    clsStudent * s2 = new local; 

    s->display(); 
    s->identifyingNumber(); 

    s2->display(); 
    s2->identifyingNumber(); 

    return 0; 
} 
+0

하지만 이론적으로 다른 파생 클래스는 멤버 변수가 다르기 때문에 조작 방법이 다릅니다. clsInternational과 local 모두 공통점이없는 매우 다른 변수가 있다면 어떨까요? 기본 클래스에서 자신의 메서드를 통해 어떻게 액세스 할 수 있습니까? – user3025784

+0

파생 형식에 실제로 액세스해야하는 경우 다음을 시도 할 수 있습니다. 'if (internationalS) {/ * 파생 클래스 함수를 호출 *// }' – NicholasM

관련 문제