2013-09-28 129 views
9

假設給出以下代碼。純虛函數重寫虛函數

class A 
{ 
public: 
    virtual void someMethod() 
    { 
     std::cout << "class A" << std::endl; 
    } 
}; 

class B : public A 
{ 
public: 
    ... 
    virtual void someMethod() = 0; 
    ... 
}; 

B覆蓋someMethod虛擬方法與 - 虛擬方法。 這樣做的目的可能是現有類的擴展,在我們的案例類A中不允許修改,但仍然有抽象類B,它必須是某些其他類的基類。

根據MISRA-C++規則10-3-3:代碼分析器發出警告:純虛函數覆蓋非純虛函數。

但我找不到有關警告的更多細節。上述代碼的副作用是什麼?這裏有什麼不好的做法?


UPDATE:標準是MISRA-C++(C++ 98)

+0

這是否意圖成爲C++ 11的virt-specifier'final'的窮人版本? (C++ 11 10.3p4) – WhozCraig

+0

如果給出警告,那麼什麼是[std :: is_abstract](http://en.cppreference.com/w/cpp/types/is_abstract)? – raina77ow

+0

請檢查更新的問題,標準是C++ 98 – deimus

回答

5

我在這裏看不到任何謎。代碼分析器可能會根據MISRA標準而不是C++ 98標準來檢查您的代碼。

MISRA是一組用於汽車環境的C/C++編碼標準,它對語言標準認爲合法/允許的內容施加了進一步的限制。

您正在用純虛函數重寫一個非純虛函數,顯然這與編譯器無關,但與MISRA規則無關。

也就是說,您的程序將編譯並執行得很好,並符合語言標準,但可能不會被需要代碼審查和符合MISRA標準的客戶接受。

+0

是的,你說的絕對正確,我提到了C++ 98,因爲C++ 11相關的特性被指出了。 – deimus

+0

顯然我會按照慣例接受它。 – deimus

3

我說你的代碼是按照標準有效:

§10.4

5 [注意:抽象類可以從不是抽象的類派生,和純虛函數可以覆蓋不純的虛函數。 - 注意]

+1

它不是編譯器錯誤地發出警告。但它是一個MISRA規則 –

+0

這不是一個錯誤的報告。 MISHA認爲這是一個_bad練習。 (爲什麼不聲明A :: SomeMethod()爲虛擬純?)。它可能被認爲是濫用,因爲一些其他MISHA規則。 – Jarod42

+0

注意:在C++ 98和C++ 11中,這是*相同的*。看到兩者之間沒有區別,包括引用的部分和段落註釋。 – WhozCraig