Статические Виртуальные функции в С ++ - PullRequest
12 голосов
/ 09 июня 2011

У меня есть базовый класс и производный, и я хочу изменить базовые функции, сохраняя их статическими, поскольку они должны передаваться другим функциям как статические.

Как я могу это сделать?

Ответы [ 7 ]

25 голосов
/ 11 июня 2011

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

template< class DerivedType >
class Base
{
public:
  static void DoSomething() { DerivedType::DoSomethingElse(); }
};

class Derived1 : public Base<Derived1>
{
public:
  static void DoSomethingElse() { ... }
};

class Derived2 : public Base<Derived2>
{
public:
  static void DoSomethingElse() { ... }
};

Это известно как Любопытно повторяющийся шаблон , который можно использовать для реализации статического полиморфизма .

3 голосов
/ 09 июня 2011

Вы имеете в виду, что вам нужен указатель на статическую функцию (например, для передачи в качестве аргумента другой функции, которая требует указателя на статическую функцию), но вам нужен виртуальный доступ к этому указателю на функцию?В этом случае используйте виртуальную функцию, чтобы получить указатель на функцию:

typedef void (*function)();
void do_stuff_with_function(function);

struct Base {
    virtual ~Base() {}
    virtual function get_function() = 0;
};

struct Derived : Base {
    function get_function() {return my_function;}
    static void my_function();
};

Derived d;
do_stuff_with_function(d.get_function());
2 голосов
/ 09 июня 2011

Статическая функция не может быть виртуальной, так как у них нет экземпляра, через который они доступны. Я верю, что вы можете перезаписать их.

1 голос
/ 09 июня 2011

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

Статическая функция-член не передает this, поэтому статические виртуальные функции не разрешены в C ++.

1 голос
/ 09 июня 2011

Вы не можете иметь статические виртуальные функции в C ++.

0 голосов
/ 09 июня 2011

Если я правильно понял ваш вопрос, тогда вы можете следовать следующему подходу, иначе проигнорируйте ..

имеет статический указатель на функцию в базовом классе.

в базовом классе есть статическая функция (в которой вы вызываете функцию, используя указатель этой статической функции) ..

в производных классах устанавливает, что статическая функция указывает на определение функции, которое вы хотите выполнить .. (в базовом классе вы можете установить указатель на функцию по умолчанию).

0 голосов
/ 09 июня 2011

У вас не может быть статических виртуальных функций, , потому что их не имеет смысла .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...