2010-05-21 2 views
1

기본 클래스 주위에 매우 얇은 래퍼 인 파생 클래스가 있습니다. 기본적으로, 나는 당신이 그것을 해석하는 방법에 따라 비교 될 수있는 두 가지 방법을 가진 클래스를 가진다. 그래서 나는 기본 클래스에서 파생 된 새로운 클래스를 생성하고 (단지 기본 클래스에 위임 한) 새로운 생성자와 새로운 클래스를 생성한다. operator==. 내가 뭘하고 싶습니다 파생 클래스에서 operator Base&() 오버로드됩니다 그래서 내가베이스로 해석해야 할 경우. 예를 들어얇은 래퍼 파생 클래스 내에서 기본 연산자로 연산자를 캐스팅하십시오.

:

class Base 
{ 
    Base(stuff); 
    Base(const Base& that); 
    bool operator==(Base& rhs); //typical equality test 
}; 

class Derived : public Base 
{ 
    Derived(stuff) : Base(stuff) {}; 
    Derived(const Base& that) : Base(that) {}; 
    Derived(const Derived& that) : Base(that) {}; 
    bool operator==(Derived& rhs); //special case equality test 
    operator Base&() 
    { 
    return (Base&)*this; //Is this OK? It seems wrong to me. 
    } 
}; 

내가 할 노력하고있어 간단한 예를 원하는 경우에, 나는 String 클래스를했다 척하고 String==String 문자 비교하여 일반적인 문자입니다. 하지만 CaseInsensitiveString==CaseInsensitiveString에서 대소 문자를 구분하지 않는 새로운 클래스 CaseInsensitiveString을 만들었지 만 다른 모든 경우에는 단지 String처럼 동작합니다. 새로운 데이터 멤버조차 가지고 있지 않으며 단지 오버로드 된 operator==입니다. (제발, std :: string을 사용하라고 말하지 마라. 이것은 단지 예일 뿐이다!)

나는이 권리에 관해 가고 있냐? 뭔가 생기있는 것 같지만 손가락을 넣을 수는 없습니다.

+0

실제 코드에서 가상 소멸자가 있기를 바랍니다. –

답변

2

DerivedBase에서 파생되므로 Derived은 이미 Base &으로 전환 가능합니다. 여분의 것을 구현할 필요가 없습니다.

또한 변환 연산자 자체에 관해서는 변환 연산자가 절대로 사용되지 않으므로 옳고 그름을 수행하는지 여부는 의문의 여지가 있습니다. 유도 - 기준 변환은 항상 내장 된 방법으로 처리됩니다. 만약 당신이 위와 같이 당신 자신의 연산자를 제공한다면 그것은 무시 될 것입니다.

서로 다른 비교 방법으로 원래의 문제를 해결하려면 어떻게 사용할지 계획하지 못했습니다.

+0

그래, 네가 맞아. 내가 그걸 놓쳤다는 것을 믿을 수 없어. 나는 항상 이것을하고 어떤 이유로 오늘 나는 그것을 보지 못했다. – miked

2

공용 상속을 사용하기 때문에 C++에서는 구현하려는 변환을 자동으로 수행합니다. 직접 할 필요가 없습니다.

그러나 나는 이것이 반드시 상속의 좋은 사용이라고 생각하지 않습니다. 가상 함수를 사용하지 않고 여기에서 사용하는 것만으로도 효과적으로 하위 클래스를 구성 할 수 있습니다. 일반적으로 동작을 변경하고 재사용하지 않기 위해 클래스를 파생시킵니다.

더 나은 알고리즘은 단순히 외부 알고리즘을 만드는 것입니다. 가상 함수가 없으므로 어쨌든 기본 포인터/참조로 대체 할 수 없으므로 명시 적 비교를 강제 실행하는 파생 클래스로 변환하는 대신 대/소문자를 구분하지 않는 비교를 수행하는 독립 실행 형 메서드를 호출하면됩니다. 런타임에 동적으로 변경해야하는 경우 (펑터를 사용하여) 알고리즘을 전달할 수도 있습니다.

관련 문제