Copying derived entities using only base class pointers, (without exhaustive testing!) - C++

后端 未结 4 1159
感情败类
感情败类 2020-12-02 17:15

Given a base class that is inherited by plethora of derived classes, and a program structure that requires you manage these via base class pointers to each entity. Is there

4条回答
  •  情歌与酒
    2020-12-02 17:33

    This approach is the preferred way of copying polymorphic objects because it offloads the responsibility of determining how to copy an object of an arbitrary type to that object, rather than trying to determine it at compile-time. More generally, if you don't know what the base class pointer points at at compile-time, you can't possibly know which of the many potential pieces of code you would need to execute in order to get a correct copy. Because of this, any working solution will need a dynamic selection of code, and the virtual function is a good way to do this.

    Two comments on your actual code. First, C++ inheritance allows a derived class overriding a base class member function to have the derived function return a pointer of a type more specific than the base class version. This is called covariance. As an example, if a base class function is

    virtual Base* clone() const;
    

    Then a derived class can override it as

    virtual Derived* clone() const;
    

    And this will work perfectly fine. This allows you, for example, to have code like this:

    Derived* d = // something...
    Derived* copy = d->clone();
    

    Which, without the covariant overload, wouldn't be legal.

    Another detail - in the code you have, you explicitly static_cast the derived pointers to base pointers in your code. This is perfectly legal, but it's not necessary. C++ will implicitly convert derived class pointers to base class pointers without a cast. If, however, you use the covariant return type idea, this won't come up because the return type will match the type of the objects you'll be creating.

提交回复
热议问题