2017-09-16 11 views
-1

내가 기본 클래스와 파생 클래스, 예를 들어,이 dynamic_cast는합니다 : 나는 아들에게 아버지 런타임에 변경하려면 내가 할 것이라는 점을 알고있다반대 작업을

class Base { 
public: 
    Base(); 
    virtual doSomthing(); 
}; 

class Derivative : class Base { 
public: 
    Derivative(); 
    virtual doSomthing(); 
}; 

Derivative& newDer = dynamic_cast<Derivative&>(baseInstance) 

내 질문은 내가 어떻게 반대 작업을 할 수 있습니다 - 아들에서 아버지로 변경?

+5

구체적인 캐스트 작업이 필요하지 않습니다. 컴파일러는 자동으로이를 해석합니다. – user0042

+1

이 작업을 수행해야하는 이유는 파생 클래스가 기본 클래스의 모든 속성을 갖기 때문입니다. 그리고 일반적으로 기본 클래스에 대한 포인터 또는 참조를 만들지 만 파생 클래스를 할당하면 컴파일 타임에 암시 적 파생 - 기반 변환이 발생합니다. – Carl

+0

간단하게 지정할 수 있습니다. Derivate **는 ** Base입니다. –

답변

2

구체적인 캐스트 작업이 필요하지 않습니다. 그들이 진짜로 경우 자동으로 Base&을 위해 전달 될 수있는 모든 Derivative&는 관계 같은

class Derivative : public Base { 
       // ^^^^^^ 
public: 
    Derivative(); 
    virtual doSomthing(); 
}; 

에 당신이 그렇게하려고 세웠 것을 가지고 글로벌 public 범위에서. 변화를 아들에서 아버지로 -


내 질문에 내가 반대의 작업을 할 수있는 방법인가?

계승 관계는 사용 된 범위에서 액세스 할 수 있어야합니다. 귀하의 예는 private 상속을 가지고 있으며 public 범위에서 작동하지 않습니다.

As mentioned by @StoryTeller하고 어떤 클래스의 멤버 함수 또는 함수 friend ED/클래스와 Derivative 내부 클래스 범위에서 작동 @Peter.

+1

공용 기반 일 필요는 없으며 바인딩이 발생하는 범위에서만 액세스 할 수 있습니다. – StoryTeller

+0

@StoryTeller 'private'상속과 함께 작동하지 않습니다. – user0042

+0

물론 그렇습니다. 어떤 멤버 함수도'* this'를'Base &'를 기대하는 함수에 전달할 수 있습니다. – StoryTeller