2013-08-29 4 views
1

가상 메서드가있는 추상 기본 클래스가 있습니다. 파생 클래스에서이 메서드가 구현됩니다. 그러나 클래스의 개체를 인스턴스화하지 않고 함수를 호출 할 수 있으려면 정적 메서드로 파생 클래스의 함수를 사용하고 싶습니다. 기본적으로은 정적 클래스에서 파생 된 기본 클래스의 가상 메서드를 구현합니다.

class Base 
{ 
    virtual double Foo(double rParam) const; 
}; 

class Derived1 : public Base 
{ 
    static double Foo(double rParam); 
}; 

class Derived2 : public Base 
{ 
    static double Foo(double rParam); 
}; 

는 Derived1 및 Derived2는 (객체 데이터에 의존하지 않는) 정적 기능의 다른 구현을 제공하지만, 난 그 기능이 순서의 다른 기능에 그 함수를 호출 할 수있을 가상되고 싶어 기본 클래스 지금 볼 수있는 유일한 솔루션은 기본 클래스의 가상 함수와 정적 함수 인 다른 클래스의 두 멤버 함수를 파생 클래스에 구현하는 것입니다. 소스 코드가 두 배가되는 것을 방지하기 위해 가상 함수는 정적 함수를 직접 호출 할 수 있습니다 (인라인 될 수 있음). 다른 솔루션?

class Derived : public Base 
{ 
    double Foo(double rParam)const 
    { 
     return FooStatic(rParam); 
    } 

    inline static double FooStatic(double rParam); 
}; 
+0

'Foo '가'virtual'으로 표시되면 이는 객체의 런타임 유형에 따라 달라 지므로 클래스의 인스턴스와 결합 될 수 없음을 의미합니다. –

+0

상황이 좀 더 까다 롭습니다. 단순화 된 예로서 함수 foo가 필요한 기본 클래스가 있다고 가정합니다. Derived1에서 이것은 선형 함수이므로 foo (x) = x와 Derived2 foo (x) = x^2에서 두 함수가 객체 데이터에 의존하지 않습니다. 그러나 기본 클래스의 다른 함수에서이 함수를 호출 할 수 있으려면 기본 클래스에서 함수를 가상으로 지정해야합니다. 파생 클래스에는 다른 데이터 멤버도 있지만 정적/가상 메서드를 사용하는 현재 예제에서는 중요하지 않습니다. – Ferdi

답변

0

나는 당신이 가지고있는 FooStatic 방법은 좋은 OO 연습을 준수 측면에서 그것에 대해 이동하는 가장 좋은 방법이라고 생각 해요. 본질적으로 비 정적 인 Foo 오버라이드는 정적 버전으로 함수 포인터처럼 작동합니다.

("처럼 작동"에 대한 강조 : Foo에 대한 재정의 FooStatic를 호출하기 전에 this에 대한 참조를 던져해야하기 때문에 실제로 직접 함수 포인터를 사용할 수 없습니다.) 그것은 이해가되지 것

0

가상 메소드를 정적으로 만든다. 가상은 개체의 유형에 따라 실행할 구현을 선택한다는 것을 의미합니다. 정적 컨텍스트에는 객체가 없습니다.

편집 : 첫 번째 예제는 컴파일되지만 예상대로 수행되지는 않습니다. 정적 메서드는 기본 구현을 재정의하지 않고 기본 메서드 대신 정적 메서드를 호출하지 않습니다. 두 번째 예제는 훌륭하지만, 아무 문제가 없다.

+1

OP의 질문을 완전히 읽지 않았다고 생각합니다. OP가하고 싶어하는 것은 정적 버전을 정적으로 사용할 수있게하면서 정적 버전을 사실상 기본 클래스로 사용할 수있게 해주므로 외부 코드가 객체 인스턴스를 만들지 않고도 사용할 수 있습니다. –

+0

이것은 정확히 문제입니다. 파생 클래스의 경우 정적입니다.하지만 파생 클래스 1과 파생 클래스 2는 함수의 구현이 다르기 때문에 기본 클래스에서 가상 함수로 호출 할 수 있기를 원합니다. 알 겠어 – Ferdi

+0

. 내 편집을 참조하십시오. – Naffnuff

관련 문제