2011-09-30 5 views
9

Al anular un método virtual, me di cuenta de que cuando cometía un error en la visibilidad (método protegido anulado como método público), el compilador .Cómo ser advertido al anular un método virtual con visibilidad incorrecta

Es válido C++, pero generalmente es un error.

Por ejemplo:

#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(); 
} 

he intentado compilar con gcc y sonido metálico, con -Wall -Wextra, sin suerte. Ejecuté CppCheck en este código, todavía no tuve suerte.

¿Qué herramienta me puede ayudar a detectar esto? Necesito arreglar todas las fuentes de una biblioteca en la que estoy trabajando.

+0

mal, no es un error. Como dije en la pregunta, reconozco que es perfectamente válido C++. Por lo general, eso no es lo que quiero, ya que expongo algo que no debe exponerse. – Julien

+0

Sí, no es un error. Es simplemente algo que el lenguaje le permite escribir, aunque esta no sea la intención del autor. Esta sería una de esas advertencias hipotéticas de "dime si quiero decir algo más", supongo. Quién sabe, tal vez haya situaciones en las que desee una función accesible para alguien que conoce el tipo derivado, pero no para cualquiera que solo conozca el tipo de base. –

+0

Esta es una excelente pregunta. –

Respuesta

0

he encontrado una solución a mis necesidades utilizando ctags.

CTags pueden analizar C++ y volcar información en un archivo.

El uso de las siguientes opciones:

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

puedo obtener toda la información necesaria en un formato fácilmente analizable.

Piping $TAGFILE a través de unos pocos comandos grep, puedo verificar que un nombre de función conocida tenga la visibilidad esperada, y emitir una advertencia con el archivo incriminado en caso contrario.

Aquí hay un fragmento bash para extraer información de la salida 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 
Cuestiones relacionadas