向下转型实际上有用吗?

Bil*_*ikh 7 c++ oop polymorphism downcast

我知道向下转换基本上是将父类指针或引用转换为派生类引用或指针,为此您使用dynamic_cast运算符。但我几乎想不出任何例子。你们能解释一下吗?

dfr*_*fri 10

奇怪的重复模板模式(CRTP)

向下转型实际上有用吗?

它在实现Curiously recurring 模板模式时非常有用:

template <class T> 
struct Base
{
    void interface()
    {
        // ...
        static_cast<T*>(this)->implementation();
        // ...
    }

    static void static_func()
    {
        // ...
        T::static_sub_func();
        // ...
    }
};

struct Derived : Base<Derived>
{
    void implementation();
    static void static_sub_func();
};
Run Code Online (Sandbox Code Playgroud)

公共基类模板接口提供了将调用委托给派生类实现的定义,通过向下转换实现(对于非静态成员函数) this将基类的指针为相应派生类的指针类型(对于特定的专业化基类模板),然后分派到派生类函数。

请注意,这种意义上的向下转换不一定要根据动态转换来实现;在本例中,静态转换用于将基类指针 ( this) 转换为相应的派生类指针。


eer*_*ika 2

没有使用动态向下转型的常见习惯用法/模式,因为它不是很有用。使用向下转型表明设计很糟糕。

如果您发现自己处于一种罕见的情况下,您认为您需要动态向下转型,因为您已经被框架或库的设计逼入了困境,那么请知道动态转型就适合您。但大多数时候(希望如此),你不会处于这种情况。

如果您想不出需要向下转型的情况,那么您就处在一个好位置,并且有大多数程序员陪伴。

对于静态向下投射,请参阅 dfri 的答案。