J'ai récemment eu un problème frustrant qui s'est résumée à une erreur de codage très simple. Considérez le code suivant:Avertissement pour un mot clé virtuel manquant
#include <iostream>
class Base
{
public:
void func() { std::cout << "BASE" << std::endl; }
};
class Derived : public Base
{
public:
virtual void func() { std::cout << "DERIVED" << std::endl; }
};
int main(int argc, char* argv[])
{
Base* obj = new Derived;
obj->func();
delete obj;
return 0;
}
La sortie est
BASE
Il est évident que (pour ce cas), je voulais mettre le mot-clé virtuel sur la base :: func afin que Derived :: func serait appelé en main. Je me rends compte que c'est (probablement) permis par la norme C++, et peut-être avec raison, mais il me semble que 99% du temps ce serait une erreur de codage. Cependant, quand j'ai compilé en utilisant g ++ et toutes les options -Wblah auxquelles je pouvais penser, aucun avertissement n'a été généré.
Y at-il un moyen de générer un avertissement quand une classe de base et une classe dérivée ont des fonctions membres du même nom où la fonction de la classe dérivée est virtuelle et la fonction de la classe de base n'est pas?
'delete' dans l'exemple ne peut pas détruire' 'Derived' parce base' n'a pas de' virtual' destructor –