静态\u强制转换/动态\u强制转换:是否更改对象? 我对C++中的代码> STATICOSTCAST 和 DyrimaCase有一定的疑虑。它们是否通过保留已设置的成员变量(无法从派生变量传递到基变量的变量除外),将指针指向的对象从类a完全更改为类B

静态\u强制转换/动态\u强制转换:是否更改对象? 我对C++中的代码> STATICOSTCAST 和 DyrimaCase有一定的疑虑。它们是否通过保留已设置的成员变量(无法从派生变量传递到基变量的变量除外),将指针指向的对象从类a完全更改为类B,c++,pointers,casting,C++,Pointers,Casting,我注意到如果我有 struct Base { Base() { } virtual ~Base() { } virtual void Method() { cout << "Base Method"; } }; class Derived : public Base { public: virtual void Method() { cout << "Override Method"; } }; struct Derived2 : pu

我注意到如果我有

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;
}
struct Base
{
Base(){}
虚拟~Base(){}

virtual void Method(){cout强制转换根本不会更改对象。它们只为您提供指向继承层次结构中相关类类型的不同指针:

Derived x;

Base         * p = &x;
AnotherClass * q = dynamic_cast<AnotherClass*>(p);

// q may or may not be NULL
x;
基准*p=&x;
另一类*q=动态铸型(p);
//q可以为空,也可以不为空
例如,如果我们有一个层次结构
AnotherClass:Base
Derived:AnotherClass
(并且
Base
是多态的),则上述动态强制转换成功

当您已经知道有一个更派生的动态类型,但恰好只有一个指向基的指针或引用时,通常可以使用
静态\u cast


(静态强制转换永远不能用于从虚拟基础上强制转换,在这种情况下,您始终需要
动态\u强制转换

那么,为什么派生对象会调用其和基构造函数,但如果我从派生类切换到派生类,则不会调用该构造函数?@JohnnyPauling:我不理解你的问题,尽管我相信你所经历的与强制转换无关。请更新你的问题,使其包含最小,您的问题的完整示例。@JohnnyPauling:您的示例只是未定义的行为(即编程错误)。没有任何解释。只有当您知道对象是所需类型时,才允许进行静态强制转换。@KerrekSB完全正确。静态强制转换用于您知道的内容超过编译器知道的内容,并且编译器完全按照您说的做。在这种情况下,您只是得到了一些恰好在中工作的指针数学的副作用这种情况。@JohnGardner:更重要的是,我假设类是无状态的,成员函数没有引用对象的状态……它实际上是静态的。