J'ai une classe de base, Token. Il n'a pas d'implémentation et agit comme une interface de marqueur. C'est le type qui sera utilisé par les appelants.Héritage C++ pour les objets sur la pile
{
Token t = startJob(jobId);
// ... (tasks)
// t falls out of scope, destructors are called
}
J'ai une classe dérivée, LockToken. Il s'enroule autour d'un mutex et assure que la serrure est acquise pendant la construction et libérée pendant la destruction. La méthode startJob est une méthode d'usine dans le sens où elle décide de renvoyer un Token (sans verrouillage) ou un LockToken (verrouillage).
Token startJob(int jobId)
{
return (jobId>0) ? LockToken() : Token() ;
}
Lorsque startJob renvoie une instance de base (un Token), tout fonctionne correctement. Dans l'autre cas (jobId> 0), il existe une copie de l'instance dérivée vers l'instance de base. Dans d'autres travaux, un Token différent est construit à partir du LockToken et le LockToken original tombe trop tôt hors de la portée, libérant le verrou dans la portée de startJob.
Comment puis-je m'en sortir? Puis-je changer startJob pour qu'il renvoie ou produise un Token vraiment covariant (ce qui signifie qu'il peut s'agir d'un LockToken)?
Ceci est connu comme le problème de tranchage, si vous êtes curieux. http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c –