2015-10-26 1 views
0

Je vais commencer par ce qui est la plupart d'entre nous savent déjà:manière standard C de créer « classe abstraite » (pure de classe virtuelle)

Si je veux que ma classe soit abstraite, je dois définir au moins une de ses méthodes comme « virtuelle pure », par exemple, ici, la méthode someFunction() est définie comme « virtuelle pure », tel qu'il est défini avec le mot-clé virtual et il est attribué à 0:

class SomeClass { 
    virtual void someFunction() = 0; 
}; 

Ma question est, quand je voulez un "abstract class", c'est-à-dire une classe qui ne peut pas être instanciée (comme "pure virtual" class), mais je veux implémenter toutes ses méthodes. Y a-t-il un moyen standard de le faire?

Ma solution actuelle est laid - je définir simplement une autre méthode virtuelle pure factice:

class UglyWorkaround { 
    public: 
     virtual void doAction1(); 
     virtual void doAction2(); 

     // My ugly workaround for making the class abstract - defining a dummy method 
     virtual void thisIsADummyMethod() = 0; 
}; 

Ceci est très mauvais, comme toute dérivation classe non abstraite devra mettre en œuvre

Est existe-t-il un moyen plus standard/populaire de définir et de mettre en œuvre une telle classe?

Je veux clarifier - je ne veux pas d'autre solution de contournement moche - je demande s'il y a un moyen standard qui est couramment utilisé. L'objectif est de rendre le code lisible pour d'autres programmeurs, donc ils comprennent tout de suite que la classe est abstraite

Répondre

1

Définir le constructeur protégé

+0

Il sonne bien sur la première pensée, mais il ne vous empêchera pas de créer des instances de votre classe à partir de ses méthodes – SomethingSomething

+1

@QuelquechoseQuelque chose, si les méthodes ne sont pas statiques, alors comment les invoquez-vous? Si elles sont statiques, elles sont probablement des méthodes d'usine qui devraient pouvoir appeler le ctor. C++ ne peut pas lire l'esprit des programmeurs. S'ils font quelque chose de mal, alors le programme fera exactement le mauvais choix qu'on lui a demandé de faire. – kay

+0

Je suis d'accord. Si vos méthodes ne sont pas statiques, elles ne pourront pas s'exécuter, car vous devriez avoir une instance que personne ne pourrait créer. Mais si vos méthodes 'sont' statiques, alors quelqu'un peut les exécuter et ils peuvent créer des instnaces. Je veux que la classe soit totalement "abstraite", comme une classe définie en Java avec le mot-clé "abstract". Je veux bloquer toute tentative d'instancier pas par le constructeur d'un enfant – SomethingSomething