unique_ptr et polymorphisme

J'ai un code qui utilise actuellement les premières pointeurs, et je veux changer de pointeurs intelligents. Cela permet le nettoyage du code de diverses manières. De toute façon, j'ai de l'usine de méthodes qui retournent des objets et de son l'appelant de la responsabilité du gestionnaire. La propriété n'est pas partagé et donc je figure unique_ptr serait approprié. Les objets de mon retour généralement tous dérivent d'une seule classe de base, Object.

Par exemple,

class Object { ... };
class Number : public Object { ... };
class String : public Object { ... };

std::unique_ptr<Number> State::NewNumber(double value)
    {
        return std::unique_ptr<Number>(new Number(this, value));
    }

std::unique_ptr<String> State::NewString(const char* value)
    {
        return std::unique_ptr<String>(new String(this, value));
    }

Les objets retournés assez souvent d'avoir à passer à une autre fonction, qui opère sur des objets de type Object (la classe de base). Sans pointeurs intelligents le code est comme ça.

void Push(const Object* object) { ... } //push simply pushes the value contained by object onto a stack, which makes a copy of the value
Number* number = NewNumber(5);
Push(number);

Lors de la conversion de ce code à utiliser unique_ptrs j'ai rencontrer des problèmes avec le polymorphisme. Au départ, j'ai décidé de modifier la définition de Push à utiliser unique_ptrs trop, mais cela génère des erreurs de compilation lors de l'utilisation de types dérivés. J'ai pu allouer des objets que le type de base, comme

std::unique_ptr<Object> number = NewNumber(5);

et passer ceux Push - qui, bien sûr, des œuvres. Cependant, j'ai souvent besoin d'appeler des méthodes sur le type dérivé. En fin de compte j'ai décidé de faire Push fonctionner sur un pointeur vers l'objet stocké par le unique_ptr.

void Push(const Object* object) { ... }
std::unique_ptr<Object> number = NewNumber(5);
Push(number.get());

Maintenant, la raison pour l'affichage. Je suis désireux de savoir si cela est normale pour résoudre le problème que j'ai eu? Est-il préférable d'avoir Push fonctionner sur la unique_ptr vs l'objet lui-même? Si oui, comment résoudre le polymorphisme des questions? Je suppose que, tout simplement, le casting du ptrs ne fonctionnerait pas. Est-il fréquent d'avoir besoin d'obtenir le sous-jacent à partir d'un pointeur de pointeur intelligent?

Merci, désolé si la question n'est pas claire (faites le moi savoir).

edit: je pense que ma fonction "Push" est un peu ambigu. Il fait une copie de la valeur sous-jacente et ne fait pas les modifier, ni de stocker, de l'objet d'entrée.

source d'informationauteur user1520427