2012-03-27 4 views
3

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

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 compilation. Может ли кто-нибудь предложить решение, которое не будет включать этот флаг?

Спасибо!

ответ

1

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

  • стандарты кодирования
  • экспертной оценки
  • , возможно, некоторые статического анализа
3

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

class B : public A { 
    virtual void vfoo() override { //OK 
    } 
    virtual void foo() override { //error 
    } 
}; 
+0

Будет ли это проверить 'virtual'ness также? – iammilind

+0

@iammilind, что вы имеете в виду? –

+0

@iammilind oh, да ... он сломает сборку, если базовый метод не является виртуальным. –

Смежные вопросы