c++ - converting a base class pointer to a derived class pointer

前端 未结 3 1979
误落风尘
误落风尘 2021-01-31 09:02
#include 
using namespace std;

class Base {
public:
  Base() {};
  ~Base() {};
};

template
class Derived: public Base {
  T _val;
public         


        
相关标签:
3条回答
  • 2021-01-31 09:52

    You must change the base type to be polymorphic:

    class Base {
    public:
        Base() {};
        virtual ~Base(){};
    };
    

    To cast from some supertype to some derived type, you should use dynamic_cast:

    Base *b = new Derived<int>(1);
    Derived<int> *d = dynamic_cast<Derived<int> *>(b);
    

    Using dynamic_cast here checks that the typecast is possible. If there is no need to do that check (because the cast cannot fail), you can also use static_cast:

    Base *b = new Derived<int>(1);
    Derived<int> *d = static_cast<Derived<int> *>(b);
    
    0 讨论(0)
  • 2021-01-31 10:01

    Try this:

    Derived<int> * d = static_cast<Derived<int>* >(b);
    

    downside it is, that you can cast class that is instance of Base() and then d->raw() will be undefined (segmentation fault likley). If that can be case, use dynamic_cast and have at least one function ob base virtual (having destructors virtual is essential when working with polmorphism).

    Virtual functions are under the hood implemented using pointer on virtual table. This pointer can be also used to identify true type of class. This is used by dynamic_cast to check if this conversion can be done and brings small extra overhead when casted.

    0 讨论(0)
  • 2021-01-31 10:03

    You can use dynamic_cast

    Derived<int> * d = dynamic_cast<Derived<int> *>(b);
    

    If the cast fails (the base pointer does not point to the requested derived type), it returns null.

    However, for dynamic_cast to work, your base class must have at least one virtual function. I suggest you make the destructor virtual (this is also prevents other potential problems deleting your objects).

    Use of dynamic_cast may indicate bad design in your code.

    Note that if you are 100% sure the base pointer, points to your derived type, then you may replace it with static_cast, which is slightly faster. Personally I prefer the extra safety check in general.

    0 讨论(0)
提交回复
热议问题