Skip to content

Latest commit

 

History

History
53 lines (40 loc) · 1.24 KB

problem_28.md

File metadata and controls

53 lines (40 loc) · 1.24 KB

<< Resolving Method Overrides at Compile-Time | Home | >> Logging

Problem 28: Polymorphic Cloning

2017-11-23

Book *pb = ...;
Book *pb2 = // I want an exact copy of *pb;

Can't call constructor directly (we don't know what *pb is, ie. don't know which constructor to call).

Standard Solution: virtual clone method

class Book {
        ...
    public:
        virtual Book *clone() { return new Book{*this}; }
};

class Text: public Book {
        ...
    public:
        Text *clone() override { return new Text{*this} ;}
};

// Comic - similar

Boilerplate code - can we reuse it?

Works better with an abstract base class:

class AbstractBook {
    public:
        virtual AbstractBook *clone() = 0;
        virtual ~AbstractBook();
};

template<typename T> class Book_cloneable: public AbstractBook {
    public:
        T *clone() override { return new T{static_cast<T&>(*this)}; }
};

class Book: public Book_cloneable<Book> { ... };
class Text: public Book_cloneable<Text> { ... };
class Comic: public Book_cloneable<Comic> { ... };

<< Resolving Method Overrides at Compile-Time | Home | >> Logging