une classe abstraite peut être mis en œuvre sans fonctions virtuelles pures en C++?
Si vous choisissez le point de vue de Static Polymorphism, vous pouvez le faire!
Une classe de base abstraite manquerait simplement une implémentation de méthode par défaut pour une méthode d'interface de la classe dérivée.
En outre, vous pouvez utiliser des constructeurs protégés pour ces modèles de classe de base CRTP, pour exiger l'héritage pour l'instanciation.
MISE À JOUR:
J'ai trouvé un beau diaporama, qui explique static vs dynamic polymorphism complètement. Chaque technique a ses avantages et ses inconvénients et certains domaines d'utilisation, en plus vous pouvez mélanger les deux techniques (judicieusement bien sûr).
Pour élaborer un peu, je vais vous donner un exemple:
template<class Derived>
class AbstractBase
{
public:
// Equivalent for a pure virtual function
void foo()
{
// static_cast<> enforces an 'Is a' relation from Derived to AbstractBase
static_cast<Derived*>(this)->fooImpl();
}
// Equivalent for simple virtual function (overidable from Derived)
void bar()
{
static_cast<Derived*>(this)->barImpl();
}
// Default implementation for any call to bar()
void barImpl()
{
}
protected:
AbstractBase() {}
};
// Compilation will fail, since ConcreteClass1 doesn't provide
// a declaration for fooImpl()
class ConcreteClass1
: public AbstractBase<ConcreteClass1>
{
}
// Compiles fine
class ConcreteClass2
: public AbstractBase<ConcreteClass2>
{
public:
void fooImpl()
{
// Concrete implementation ...
}
}
L'exemple suivant montre que le modèle introduit applique au-dessus d'un « Est-ce une » relation entre la classe abstraite et héritant classe (paramètre modèle)
class ConcreteClass3
{
public:
void fooImpl()
{
// Concrete implementation ...
}
}
// Instantiation will fail, because
// * the constructor is protected
// * at least the static cast will fail
AbstractBase<ConcreteClass3> instance;
S'il n'y a pas au moins une fonction virtuelle pure, alors ce n'est pas une classe abstraite. –
* Qu'essayez-vous réellement de faire? * – Beta
Ce que j'essayais de faire était d'imiter l'effet que la fonction virtuelle pure a dans la classe sans avoir la fonction virtuelle virtuelle dans la classe! – Sankalp