当前位置: 首页 > 知识库问答 >
问题:

向下投射实际上是有用的?

宋英杰
2023-03-14

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

共有3个答案

太叔涵亮
2023-03-14

>

  • 您从不太信任的外部/用户代码获取抽象类。 并且您需要验证它是否与您期望的类型匹配。 如果不匹配,则报告错误而不是使用UB。 此外,如果你要向用户/外部代码公开太多你的代码/类--所以你把它们隐藏在接口类后面--这将是一个问题。

    对于一般的对象管理器类很有用-它存储抽象类而不需要理解那些是什么。 因此,每当用户试图获取这些类型中的一个并强制转换为适当的类型时,它应该应用动态强制转换以确保用户不会搞乱这些类型。

    它用于处理具有非平凡层次结构的复杂类--对此,简单的指针强制转换可能会失败。 然而,从总体上处理这类类是不明智的。

  • 史默
    2023-03-14

    没有使用向下转换的常见习惯用法/模式,因为它不是很有用。 使用向下投射表示设计不佳。

    如果您发现自己处于一种罕见的情况,您认为您需要向下转换,因为您已经被框架或库的设计画成了墙角,那么要知道动态转换是为您准备的。 但大多数时候(希望如此),你不会处于那种情况。

    如果你想不出一个情况下你会需要下降,那么你是在一个好的地方,并与大多数程序员相伴。

    逑翰翮
    2023-03-14

    向下投射实际上是有用的?

    在实现奇怪地重复出现的模板模式时,它非常有用:

    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();
    };
    

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

    注意,在这种意义上的向下转换不一定需要在动态转换方面实现; 在本例中,静态强制转换用于将基类指针(this)强制转换到相应的派生类指针。

     类似资料:
    • 我想找到一种方法,使悬停属性在投票后保持活动状态,这是状态,并让Javascript或Firebase记住为该用户保持投票图标处于该状态。所以当一个用户投了几个名字,然后再回到页面时,他们会看到他们投了哪些名字,他们投的是什么。 我正在寻找如何实现这一目标的想法。 目前,在firebase中,我将用户的身份验证ID(uid)保存在他们投票的每个人的名字中,或者是1或者是-1表示支持或支持。我确信可

    • 我从一个RPC服务接收到一个通用的类型实例,我要将该实例转换为类型实例,此操作的时间复杂度是多少?性能对我的应用程序至关重要。(对于像Java和C#这样的语言) 示例:或

    • 问题内容: 在构建RPM软件包的过程中,我必须指定BuildRoot,以后将在%install中使用它来侵害$ RPM_BUILD_ROOT。我一直认为$ RPM_BUILD_ROOT是RPM执行打包的假安装。然后,在使用RPM软件包进行安装时,它将安装到实际位置。例如: 我认为$ RPM_BUILD_ROOT仅用于打包过程,并且在某些方面,当用户执行“ rpm -ivh package.rpm”

    • 本文向大家介绍Swift投射,包括了Swift投射的使用技巧和注意事项,需要的朋友参考一下 示例 将函数应用于集合/流并创建新的集合/流称为投影。            

    • 我正试图把我的头缠在Apache Mesos上,需要澄清几个项目。 我对Mesos的理解是,它是一个安装在集群中的每个物理/VM服务器(“节点”)上的可执行文件,然后提供一个Java API(不知何故),将每个单独的节点视为计算资源(CPU/RAM/等)的集体池。因此,对于使用Java API编码的程序,他们只看到一组资源,而不必担心如何/在哪里部署代码。 因此,首先,我在这里的理解可能是根本错误

    • 我在看一个典型的for循环: 我对int I=1后的分号很满意:它是一个声明新变量的语句。如果i也是一个语句,为什么后面没有分号? 另一个例子。我打开Jshell并放置以下内容: 换句话说,命令可以工作,与是否有分号无关。我希望没有它就无法工作。 最后一个示例(改编自关于

    • 我已经回答了一个关于Python中的绝对导入的问题,我认为通过阅读Python2.5更改日志和附带的PEP我理解了这个问题。但是,在安装Python2.5并尝试创建一个从__future__import absolute_import中正确使用

    • 问题内容: Python使我们能够在类中创建“私有”方法和变量,方法是在名称前加上双下划线,例如:。那么,如何解释这一点 这是怎么回事?! 我会为那些不太了解的人解释一下。 我在那里所做的是创建一个具有公共方法和私有方法的类,并将其实例化。 接下来,我将其称为public方法。 接下来,我尝试调用其私有方法。 这里看起来一切都很好。我们无法调用它。实际上,它是“私有”的。好吧,实际上不是。在对象上