2009-12-20 10 views
1

Supposons que j'ai une classe Base qui a une variable membre A * my_hash. J'ai aussi la classe Extended qui hérite de la classe Base. J'ai aussi une classe B qui étend A.Question de conception C++

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 
    A* my_hash; 

}; 

class Extended:public Base{ 
//methods which use my_hash from A 
//I cannot have a B* my_other_hash in this class 
//I would like to substitute B* my_hash 
//I cannot let Base create my_hash (of type A*) because that is not what I want. 
}; 

Je voudrais faire l'extension habituelle (c.-à-utiliser tout ce qu'il hérite de A), à l'exception et avec une différence importante, je veux my_hash d'être B * au lieu d'un*.
Chaque fois que quelque chose accède à my_hash, soit via les méthodes de Extended ou les méthodes de Base, je voudrais que les méthodes à exécuter soient des B *. Une chose à essayer: Je ne peux pas avoir un appel de méthode (par exemple, create_hash() dans Base()) que je redéfinis dans Extended. Cela ne fonctionne pas car il ne semble pas possible de remonter à la classe Extended lorsque je crée le hachage.

Je ne voudrais pas que Base soit au courant de B. Comment faire?

+0

Est-ce que B est dérivé de A? Ou: A-t-il quelque chose à voir avec A? –

+0

@Federico: Il est là dans le premier paragraphe "J'ai aussi une classe B qui étend A." –

+0

Avec les réponses ci-dessous, assurez-vous que la classe A contient des méthodes virtuelles afin que si vous invoquez la méthode via le pointeur de la classe A, les méthodes de B sont exécutées. – Jagannath

Répondre

4

Si le type de « B » étend « A », vous pouvez le configurer de sorte que vous passez la valeur pour « m_hash 'à travers le constructeur (vous pouvez aussi cacher ce constructeur comme protégé donc le code qui n'hérite pas de' Base 'ne peut pas l'étendre).

par exemple.

class Base{ 
    Base(): my_hash(new A) {} 
    //methods which use my_hash 
protected: 

    A* my_hash; 
    Base(A* hash): my_hash(hash) {} 
}; 

class Extended:public Base{ 
public: 
    Extended() : Base(new B) {} 
}; 

Aussi, si vous voulez de nouvelles fonctions spécialisées dans « B » que vous pouvez appeler à partir « Extended », vous pouvez stocker que dans un autre pointeur ou tout simplement jeter « my_hash » taper « B * » .

0

Un modèle pourrait être le chemin à parcourir ici, comme suggéré par Autopulated. Une autre façon de le faire est en fait d'avoir un B * my_other_hash (comme vous le mentionnez dans la question), et ensuite dans ctor de B, mon_other_hash à my_hash. Ensuite, vous pouvez accéder aux méthodes A dans Base et A ou B dans Extended. Vous pouvez ensuite accéder aux méthodes A dans Base et A ou B dans Extended. Assurez-vous de ne supprimer que l'un d'entre eux! Dans le dteur de Base ou en dehors de la hiérarchie si vous gérez la mémoire ailleurs.