代码之家  ›  专栏  ›  技术社区  ›  Johnny Pauling

static_cast/dynamic_cast:它会更改对象吗?

  •  0
  • Johnny Pauling  · 技术社区  · 12 年前

    我对 static_cast dynamic_cast 在C++中。他们是不是 彻底地 更改指针从类指向的对象 A 去上课 B 通过保留已经设置的成员变量(除了那些不能从派生传递到基的变量)?

    我注意到,如果我有这样的东西

    struct Base
    {
        Base() { }
        virtual ~Base() { }
        virtual void Method() { cout << "Base Method"; }
    };
    
    class Derived : public Base
    {
    public:
        virtual void Method() { cout << "Override Method"; }
    };
    
    struct Derived2 : public Derived
    {
        Derived2() { cout << "Derived2 constructor"; }
        void Method() { cout << "Override2 Method"; }
    };
    
    int main()
    {       
        Base *myPointer = new Derived();    
        static_cast<Derived2*>(myPointer)->Derived2::Method();   
        delete myPointer;    
        return 0;
    }
    

    构造函数没有被调用,但方法调用了。这怎么可能?

    1 回复  |  直到 12 年前
        1
  •  12
  •   Kerrek SB    12 年前

    强制转换根本不会更改对象。他们只会给你一个不同的 指针 到继承层次结构中的相关类类型:

    Derived x;
    
    Base         * p = &x;
    AnotherClass * q = dynamic_cast<AnotherClass*>(p);
    
    // q may or may not be NULL
    

    例如,如果我们有一个层次结构,上面的动态强制转换就会成功 AnotherClass : Base Derived : AnotherClass (以及 Base 是多态的)。

    A. static_cast 通常可以在您已经使用时使用 知道 您有一个更派生的动态类型,但恰好只有一个指向基的指针或引用。

    (静态强制转换永远不能用于从虚拟基础进行强制转换,在这种情况下 总是 需要 dynamic_cast .)