3 votes

Comment imposer des restrictions concernant la classe dérivée?

Considérez le modèle de modèle récurrent curieux, pouvez-vous empêcher le code non sécurisé suivant de compiler?

template <class Derived>
class Base {
public:
    void foo()
    {
        // faire quelque chose en supposant que "this" est de type Derived :
        static_cast<Derived*>(this)->bar();
    }
};

// C'est OK
class A: public Base<A>
{
public:
    void bar()
    {
        // ...
    }
};

// Crash and burn, should be prevented by the compiler
class B: public Base<A>
{
    //...
};

void f()
{
    // comportement indéfini : objet B a été static_cast en A
    B{}.foo();
}

Y a-t-il un moyen d'ajouter une sorte de restriction à la classe Base pour empêcher la définition de class B d'être valide?

3voto

Yakk Points 31636

Vous pouvez rendre le constructeur Base (ou le destructeur) privé et ami de D.

Vous devrez ajouter

A()=default;
B()=default;

publiquement, mais lorsque vous le faites, B ne peut pas être créé. Ce qui est bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X