From the boost library documentation I read this:
  Conceptually, smart pointers are seen as owning the object pointed to,
  and thus responsible for deletion of the object when it is no longer
  needed.
I have a very simple problem: I want to use RAII for pointer attributes of a class that is Copyable and Assignable. 
The copy and assignment operations should be deep: every object should have its own copy of the actual data. Also, RTTI needs to be available for the attributes (their type may also be determined at runtime).  
Should I be searching for an implementation of a Copyable smart pointer (the data are small, so I don't need Copy on Write pointers), or do I delegate the copy operation to the copy constructors of my objects as shown in this answer? 
Which smart pointer do I choose for simple RAII of a class that is copyable and assignable? (I'm thinking that the unique_ptr with delegated copy/assignment operations to the class copy constructor and assignment operator would make a proper choice, but I am not sure) 
Here's a pseudocode for the problem using raw pointers, it's just a problem description, not a running C++ code: 
// Operation interface
class ModelOperation
{
    public: 
        virtual void operate = (); 
};
// Implementation of an operation called Special 
class SpecialModelOperation
:
    public ModelOperation
{
    private:
        // Private attributes are present here in a real implementation. 
    public: 
        // Implement operation
        void operate () {}; 
};
// All operations conform to ModelOperation interface
// These are possible operation names: 
// class MoreSpecialOperation; 
// class DifferentOperation; 
// Concrete model with different operations
class MyModel 
{
    private: 
        ModelOperation* firstOperation_; 
        ModelOperation* secondOperation_;  
    public:
        MyModel()
            : 
                firstOperation_(0), 
                secondOperation_(0)
        {
            // Forgetting about run-time type definition from input files here.
            firstOperation_  = new MoreSpecialOperation(); 
            secondOperation_ = new DifferentOperation(); 
        }
        void operate()
        {
            firstOperation_->operate(); 
            secondOperation_->operate();
        }
        ~MyModel() 
        {
            delete firstOperation_; 
            firstOperation_ = 0; 
            delete secondOperation_; 
            secondOperation_ = 0; 
        }
};
int main()
{
    MyModel modelOne; 
    // Some internal scope
    {
        // I want modelTwo to have its own set of copied, not referenced 
        // operations, and at the same time I need RAII to work for it, 
        // as soon as it goes out of scope.  
        MyModel modelTwo (modelOne); 
    }
    return 0;
}