2012-03-27 65 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編譯標誌。 任何人都可以提出一個解決方案,不會涉及此標誌?

謝謝!

回答

1

在C++ 03標準,它是不可能檢查方法是否宣佈爲virtual或不。
您可以遵循,

  • 編碼標準
  • 同行評審
  • 可能是一些靜態分析工具
3

在C++ 11有可能在class函數聲明的末尾添加override,它會產生一個警告,如果該功能沒有覆蓋任何東西:

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

將它檢查'virtual'ness也? – iammilind 2012-03-27 13:11:03

+0

@iammilind你是什麼意思? – 2012-03-27 13:11:38

+0

@iammilind哦,是的......如果基本方法不是虛擬的,它將破壞構建。 – 2012-03-27 13:12:34

相關問題