动态的好处/用处是什么?

这个问题在这里已经有了答案:

  • 使用dynamic_cast代替传统的多态性有什么优势? 5个答案
  • 什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast? 6个答案

  • 如果你不使用强制转换,那么非虚拟成员函数就会调用Base方法。 以下代码显示了虚函数和非虚函数之间的区别,以及动态转换后会发生什么。

    class Base
    {
    public:
        void print2() {
            cout << "Base" << endl;
        }
        virtual void print() {
            cout << "Base" << endl;
        }
    };
    
    class Derived : public Base
    {
    public:
        void print2() {
            cout << "Derived" << endl;
        }
        virtual void print() {
            cout << "Derived" << endl;
        }
    };
    
    int main()
    {
        Base* ptrb1 = new Base();
        //it will print Base
        ptrb1->print();
        ptrb1->print2();
    
        Base* ptrb2 = new Derived();
        // it will print Derived
        ptrb2->print();
        ptrb2->print2();
    
        Derived* ptrd = NULL;
        //what is the difference between 2ways?
        //what is the benefit of useing dynamic_cast?
        ptrd = dynamic_cast<Derived*>( ptrb2 );
        ptrd->print();
        ptrd->print2();
    }
    

    如果您要使用static_cast (因为您可能倾向于认为在重新投射指针时可以这样做),那么仍然从Base派生的另一个类将被错误地转换。 dynamic_cast会显示转换不可能并返回nullptr


    尽可能使用这种虚拟功能。

    使用dynamic_cast如果:

  • 你不能找出一种方法来使用虚拟功能,或者
  • 该函数对派生类非常具体,将它的任何内容放在基本接口中是没有意义的
  • 你需要找出你的基指针是否真的是一个派生的特定类型,而不是只是要求它去做或得到某些东西。

  • dynamic_cast提供基于运行时类型信息的子类检查,回答这个问题:

    这是特定派生类型的基类对象吗?

    如果答案是肯定的(投票成功),那么我们可以使用该对象作为其派生类型,否则我们不能。

    如果没有运行时类型信息和dynamic_cast ,C ++程序员将不得不将自己的ad-hoc类型测试合并在一起来完成同样的任务。

    为什么有时候需要一个明确的类型检查,就是需要做一些特定于子类型的小动作,并且你不想为虚拟方法引入繁琐的形式化方法。

    其他强制转换(如static_castdynamic_cast不同之处在于,它们不会进行运行时类型检查,并且不会失败:如果强制进行无意义的转换,它们可能会生成虚假结果。

    链接地址: http://www.djcxy.com/p/28703.html

    上一篇: What is the benefit/use of dynamic

    下一篇: What is the purpose of reinterpret