2011-09-30 18 views
9

覆蓋虛擬方法時,我注意到當我在可見性中犯了一個錯誤(作爲公共方法重寫的受保護的方法)時,編譯器沒有提醒我。如何在覆蓋具有錯誤可視性的虛擬方法時發出警告

它是有效的C++,但通常是一個錯誤。

例如:

#include <iostream> 

class Base 
{ 
protected: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Base::ProtectedMethod" << std::endl; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Derived::ProtectedMethod" << std::endl; 
    } 
}; 

int main(int, char* []) 
{ 
    Derived d; 
    d.ProtectedMethod(); 
} 

我試着用gcc和鏗鏘編譯,與-Wall -Wextra,沒有運氣。 我在這段代碼上運行了CppCheck,仍然沒有運氣。

什麼工具可以幫助我檢測到這一點? 我需要修復正在處理的庫的所有來源。

+0

好不是一個錯誤。正如問題所述,我承認這是完全有效的C++。通常情況下,這不是我想要的,因爲我揭露了一些不應該暴露的東西。 – Julien

+0

是的,這不是一個錯誤。這只是語言允許你寫的東西,儘管這可能不是作者的意圖。這是假設的「告訴我,如果我的意思是別的」警告,我想。誰知道呢,也許有些情況下,你確實想要一個知道派生類型的人可以訪問的函數,但是不知道只知道基類型的人。 –

+0

這是一個很好的問題。 –

回答

0

我發現了一個解決方案,使用ctags我的需求。

CTags可以解析C++並將信息轉儲到文件。

使用下列選項:

$CTAGS -f $TAGFILE --fields=fkstia --c++-kinds=+p -R $SOURCES 

我可以得到一個容易解析的格式都需要的信息。

管道$TAGFILE通過幾個grep命令,我可以驗證一個已知的函數名稱具有預期的可見性,否則發出警告的文件。

這裏是一個bash片段提取從ctags的輸出信息:

#!/bin/bash 
function check_method { 
    echo "Checking $1 (should be $2 and is not)" 
    cat $TAGFILE | grep "^$1 " | grep "access" | grep -v "access:$2" | cut -f 2 
    echo 
} 

# will warn anytime a method called ProtectedMethod is not protected 
check_method ProtectedMethod protected