2014-12-02 4 views
0

기본 클래스와 파생 클래스가 있고 BaseType과 DerivedType도 있습니다. Base class i에 BaseType의 객체 (포인터가 아님)가 있습니다. Derived 클래스의 생성자에서 BaseType에서 DerivedType으로 동적 캐스팅을 수행하려고합니다.내구성있는 생성자 내부의 dynamic_cast

class DerivedType: public BaseType{}; 

class Base{ 
    BaseType basetype; //not a pointer 
} 

class Derived : public Base{ 
    Derived(){ 
     //I want to do in this constructor a dynamic_cast from 
     // "basetype" to "DerivedType" 
     // when "DerivedType" inherits from "BaseType" also 
    } 
}; 

나는 두 클래스 class DerivedType: public BaseTypeclass Derived : public Base

내가 BaseType의 대상 (안 포인터)

을 가지고 있고가이 객체의 유형을 변경 Derived 클래스의 생성자에 필요한 Base 클래스에 있습니다 DerivedType 내 상사가 사용하라고 말했습니다. dynamic_cast

을 사용하면됩니다. 내가 'baseType 여기서'를 사용합니다 때

그것은 것를 automaticly DerivedType하지 BaseType

+0

나는 이해할 것이라고 생각하지 않습니다. 'Base'가'BaseType' 클래스와'Derived' 클래스의 멤버가'DerivedType' 멤버를 가지기를 원합니 까? 이것은 가능하다. 'Derived'의'DerivedType' 객체가 해당'Base'의'BaseType' 객체와 같은 객체가되기를 원합니까? 그것은 직접 표현할 수 없습니다. 어쨌든; 왜'dynamic_cast'가 필요하다고 생각하니? –

+0

다이내믹 캐스트로 캐스팅 할 대상은 무엇입니까? 예제에서'BaseType * '에 의해 지시 된'DerivedType' 인스턴스는 없습니다. – user2079303

+0

'dynamic_cast'가 무엇을 오해하는지 알 것 같습니다. 당신이 성취하고자하는 것에 대해 더 자세히 설명해 주시겠습니까? –

답변

2

할 수 있습니다하지 변화dynamic_cast 또는 다른 방법을 사용하여 여부를 회원 basetype의 유형입니다.
사장님이 귀하에게 그렇게 하셨다고 말하면, 그들은 매우 잘못되었거나 귀하가해야 할 일을 명확하게 전달하지 못했습니다. 나는 당신이 설명을 요구할 것을 권한다.

이 (즉, 구성원 유형 서브 클래스에 따라 다릅니다)를 구현하는 한 가지 일반적인 방법은 매개 변수로 회원의 유형을 통과, 템플릿으로 기본 클래스를 돌려입니다

:

template<typename MemberType = BaseType> // Default type is BaseType 
class Base{ 
    MemberType something; 
} 

class Derived : public Base <DerivedType> 
{ 
     Derived() 
     { 
      // 'something' has type DerivedType 
     } 
}; 
+0

당신의 솔루션은'Base'로부터 파생되는 지점을 오히려 부정합니다. 그렇지 않습니다. 더 이상 공통 기본 클래스가 없기 때문에 다형성이 작동하지 않습니다. –

0

한 가지 매우 중요한 점 : 일단 객체가 생성되면 유형은 이며 고정되어 있으며 관계없이 변경할 수 있습니다. Basebasetype라는 이름의 멤버 이있는 경우 해당 개체는 모든 파생 클래스가 액세스하기 전에, Base의 생성자에 의해 구성하고, 그 객체의 유형은 Base에 선언하고, 절대 변경할 수 없습니다 것입니다. dynamic_cast (예 : dynamic_cast<DerivedType&>), 을 사용하면 캐스트가 실패 할 수 있습니다.

달성하려는 목표가 명확하지 않습니다. 아마도 의 변형이며 전략 패턴은 사용자가 찾고있는 것입니다. 여기서 Base::basetypeBase::Base()에 전달 된 개체에 대한 포인터 또는 참조로 Derived::Derived()입니다. 또는 실제로는 변경해야하는 basetype 의 값일 수 있습니다. 이는 문제가되지 않습니다. (이름은 입니다.) 달성하려는 내용을 설명하고 해결책을 찾을 수 있습니다.