2013-08-29 2 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 подход у вас есть лучший способ пойти об этом, с точки зрения соблюдения хорошей ОО практике. По сути, ваши нестатические переопределения Foo работают как указатели на функции в ваших статических версиях.

(акцент на «работать, как» вы не можете использовать указатели на функции непосредственно, так как переопределения для Foo должен выбросить ссылку на this перед вызовом FooStatic.)

0

Это не имело бы смысла сделать виртуальный метод статическим. Виртуальный означает, что вы выбираете, какая реализация должна выполняться в зависимости от типа объекта. В статическом контексте у вас нет объекта.

EDIT: Пока первый пример будет скомпилирован, он не будет делать то, что вы ожидаете от него. Статические методы не будут переопределять базовую реализацию, а скорее скрыть ее, что означает, что статические методы никогда не будут вызываться вместо базового класса. Второй пример хорош, хотя я не вижу никаких проблем с ним.

+1

Я думаю, вы не полностью прочитали вопрос OP. То, что OP хочет сделать, это сделать эти статические версии доступными практически для базового класса, при этом статические версии доступны статически, чтобы внешний код мог использовать его без создания экземпляра объекта. –

+0

Это точно проблема, поскольку производные классы являются статическими, однако я хочу иметь возможность называть это из базового класса как виртуальной функции, потому что производные 1 и производные 2 имеют разные реализации функции. – Ferdi

+0

Я вижу. См. Мое редактирование. – Naffnuff