2013-05-22 1 views
1
#include<stdio.h> 

class parent 
{ 
public: 
    parent() 
    { 
    } 
}; 

class child : public parent 
{ 
public: 
    child() 
    { 
    } 
}; 

class master 
{ 
public: 
    void view(parent a) 
    { 
     printf("view parent instances"); 
    } 
    void view(child b) 
    { 
     printf("view child instances"); 
    } 
}; 

int main() 
{ 
    parent *ptr; 
    master mymaster; 

    ptr = new child; 

    mymaster.view(*ptr); 

    return 0; 
} 

출력 : "부모 인스턴스보기" 부모 클래스에서 포인터를 만듭니다. 그 포인터를 자식 유형으로 선언했습니다. 내가 mymaster.view (* ptr)를 실행할 때; , 항상 첫 번째보기 기능 (void view (parent a))으로 이동하는 방법 (void view (child b))으로 이동합니다. 감사합니다자식 인스턴스에 액세스하는 방법

답변

0

*(parent*)의 유형은 parent이므로 호출되는 메소드는 view(parent)입니다. view(child)을 호출하려면 포인터를 전달하기 전에 child*에 캐스팅해야합니다. ...

OOP를 거꾸로 사용하고 있습니다. 각각의 특정 유형의 하위 클래스를 사용하는 방법을 알고있는 여러 메소드를 정의하지 않으며, 상위 클래스가 제공하는 계약을 존중할 수있는 하나의 메소드를 정의하며, 하위 클래스는 자체적으로 자체적으로 작업을 수행합니다.

0

ptrparent 개체에 대한 포인터입니다. view(child) 함수를 호출하려면 child 객체를 함수 호출에 전달해야합니다.

또는, child 포인터

mymaster.view(*(child*)ptr); 

에 캐스팅 할 수 있지만 다른 모든 종류의 문제로 끝날 가능성이 높아집니다.

0

컴파일러는 최선의 선택에 따라 일치하는 방법을 결정합니다.

컴파일러는 변수가 parent 유형임을 확인하여 일치하는 메서드를 호출합니다.

3

약간의 리팩터링과 약간 다른 방법을 사용하면 virtual 함수를 사용할 수 있습니다. 이것은 아래와 같이 포인터를 사용하여 호출 할 때 파생 클래스의 함수를 사용할 수있게합니다.

#include<stdio.h> 

class parent 
{ 
public: 
    parent() 
    { 
    } 
    virtual void view() 
    { 
     printf("View parent"); 
    } 
}; 

class child : public parent 
{ 
public: 
    child() 
    { 
    } 
    virtual void view() 
    { 
     printf("View child"); 
    } 
}; 

class master 
{ 
public: 
    void view(parent *a) 
    { 
     a->view(); 
    } 
}; 

int main() 
{ 
    parent *ptr; 
    master mymaster; 
    ptr = new child; 
    mymaster.view(ptr); 
    return 0; 
} 

이 의지 출력 "보기 아이". virtual 키워드가없는 동일한 코드는 "부모보기"을 출력합니다. 키워드는 상위 클래스에 있어야하지만 명확성을 위해 파생 클래스에서도 자주 사용됩니다. 가상 함수에

Wikipedia article

꽤 잘 상황을 설명 :

가상 함수는 '말'해결됩니다. 문제의 함수가 기본 클래스의 '가상'인 경우 함수의 가장 파생 된 클래스 구현 은 포인터의 선언 된 유형 또는 참조에 관계없이 참조 된 객체 의 실제 유형에 따라 호출됩니다. . '가상'이 아니면 메소드가 '초기'로 결정되고 포인터 또는 참조의 선언 된 유형에 따라 호출 된 함수가 선택됩니다.

여기에 객체의 실제 타입이 아이 때문에는 가상 함수는 아이의 기능은 포인터가 부모 유형의 경우에도라고되어 있는지 확인합니다.

관련 문제