Проверка времени компиляции того, определен ли метод как виртуальный - PullRequest
3 голосов
/ 27 марта 2012

Я пытаюсь найти способ проверить в производном классе, определяется ли метод базового класса как «виртуальный». В основном я хотел бы иметь следующий код:

class A {
  virtual void vfoo() {}
  void foo() {}
  virtual ~A() {}
};

class B : public A {
  virtual void vfoo() {
    MAGIC_CHECK(m_pA->vfoo()); // succeed
    // code
    m_pA->vfoo();
    // code
  }
  virtual void foo() {
    MAGIC_CHECK(m_pA->foo()); // fail compilation because foo is not virtual!
    // code
    m_pA->foo();
    // code
  }
  A * m_pA;
};

Вопрос в том, как мне реализовать этот MAGIC_CHECK? Одним из решений для этого может быть использование -Woverloaded-virtual флага компиляции. Кто-нибудь может предложить решение, которое не будет включать этот флаг?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

В C ++ 11 возможно добавить override в конце объявления функции в class, и оно выдаст предупреждение, если функция ничего не переопределит:

class B : public A {
  virtual void vfoo() override { //OK
  }
  virtual void foo() override { //error
  }
};
1 голос
/ 27 марта 2012

В стандарте C ++ 03 невозможно проверить, объявлен ли метод как virtual или нет.
Вы можете следовать кодированию

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