2010-07-27 3 views
3

상속 된 클래스에 대한 포인터를 가리키는 포인터로 기본 클래스 함수를 호출 할 때 컴파일 오류가 발생하는 이유는 무엇입니까?상속 및 포인터 포인터 : 왜 작동하지 않으며 어떻게 처리합니까?

예 : 나는이 문제를 어떻게합니까

class cFoo {}; 
class cBar : public cFoo {}; 
void func1(cFoo *) {} // base class 
void func2(cFoo **) {} // base class 

void main(void) 
{ cBar bar, *pbar; // inherited class 

    func1(&bar); // compiles OK 
    func2(&pbar); // fail 
    func2(dynamic_cast<cFoo**>(&pbar)); // 'class cFoo ** ' : invalid target type for dynamic_cast 
} 

?

답변

2

dynamic_cast이 포인터 또는 클래스에 대한 참조에서 작동하기 때문에 작동하지 않습니다. 포인터에 대한 포인터에이 포인터를 사용하려고합니다. 그 일을하면 아무와 CBAR 포인터로 cFoo 객체를 넣어 관리하는 것,

class cFoo {}; 
class cBar : public cFoo {}; 
void func1(cFoo *) {} 
void func2(cFoo **p) { *p = new cFoo; } // modify pointee 

void main(void) 
{ cBar bar, *pbar; // inherited class 

    func1(&bar); // compiles OK 

    func2(&pbar); 
} 

:

func2(&dynamic_cast<cFoo*>(pbar)); 
+2

임시 주소를 사용하지 않습니까? 그게 정말로 허용됩니까? –

+1

@ 앤더스에 대해'dynamic_cast '그 다음은 무엇입니까? –

6

는 다음 사항을 고려하십시오

간단한 수정은 다음과 같이 될 것이다 컴파일러 오류 및 유형 시스템이 파괴되었습니다. 캐스팅이 손상을 방지 할 수있는 방법이 없으므로 동적 캐스팅이 도움이되지 않습니다.

0

당신이하려는 것은 결함이 있습니다.

(비 const) 포인터를 함수 인수로 사용하는 일반적인 경우는 함수가 인수를 수정하여 일부 인스턴스의 포인터를 가리키는 것입니다.

인스턴스를 선택하는 기능입니다. 예제 공장 메서드입니다.

인수 유형은 함수가 유효하다고 보증하는 유형을 설명합니다.

함수가 인스턴스가 cBar임을 보장한다면 cBar ** 인수를 취해야합니다.

cFoo **를 사용하기 때문에 오브젝트가 유효한 cFoo만이 보장됩니다.

캐스트를 강제하면 모든 유형의 cFoo가 cBar로 노출됩니다. 그렇지 않은 경우에도 마찬가지입니다.

+0

예, 문제가 있다고 생각합니다. func2()가 cBar **를 전달한다는 것을 알기를 기대할 수 없습니다. 실생활에서 나는 TomW가 위에 보여준 것과 정확히 똑같이하고있다. (메모리 할당). 한숨 ... 나는 그걸 해결할 수 있지만 우아하지는 않을 것이다. 귀하의 신속하고 전문적인 도움에 감사드립니다. – Pierre