CVFCD -- Appel de fonctions virtuelles depuis les constructeurs et le destructeur

De RAD Studio
Aller à : navigation, rechercher

Remonter à Audits C++


Description

Dans un constructeur, le mécanisme d'appel virtuel est désactivé car la redéfinition des classes dérivées n'a pas encore eu lieu. Les objets sont construits depuis la classe de base, "base avant dérivé". Par conséquent, vous ne devez pas utiliser les fonctions virtuelles dans les constructeurs ou les destructeurs.

La destruction est effectuée "dans la classe dérivée avant la classe de base", ainsi les fonctions virtuelles se comportent comme dans les constructeurs. Seules les définitions locales sont utilisées, et aucun appel n'est effectué aux fonctions de redéfinition afin d'éviter de toucher la partie classe dérivée (maintenant détruite) de l'objet.

Incorrect

 #include <iostream>
 #include <string>
 using namespace std;

 class B {
 public:
   B(const string& ss) { cout << "B constructor\n"; f(ss); }
   virtual void f(const string&) { cout << "B::f\n";}
 };

 class D : public B {
 public:
   D(const string& ss) :B(ss) { cout << "D constructor\n";}
   void f(const string& ss) { cout << "D::f\n"; s = ss; }
 private:
   string s;
 };

 int main() {
   D d("Hello");
 }

Le programme est compilé et il produit :

B constructor
B::f
D constructor

Voir aussi