C++ 有没有办法将对象动态更改为另一种类型?

C++ 有没有办法将对象动态更改为另一种类型?,c++,C++,假设我有一个从父类B继承的类a,还有另一个从类B继承的类C。有没有办法在运行时将类a的指针更改为类C class A : public B { A::someFunction() { //can I change this pointer to class C here? } } class C : public B { ... } 你不能也不应该。原因很简单。看看这个代码 类基{ 公众: Base(){} 虚拟void SayHello(){} };

假设我有一个从父类B继承的类a,还有另一个从类B继承的类C。有没有办法在运行时将类a的指针更改为类C

class A : public B {
    A::someFunction() {
        //can I change this pointer to class C here?
    }
}

class C : public B {
    ...
}

你不能也不应该。原因很简单。看看这个代码

类基{
公众:
Base(){}
虚拟void SayHello(){}
};
A类:公共基础{
公众:
A_派生(){}
虚拟void SayHello()重写{…}
void SayAllo(){…}
};
B_类派生:公共基{
公众:
B_派生(){}
虚拟void SayHello()重写{…}
void SayBello(){…}
};
现在,当我们将
A_-Derived
类指针指定给
B_-Derived
时,编译器将允许调用
SayBello
方法。这是因为对于编译器来说,它是一个
B_派生的
类指针,它不知道实际的指针数据指向
a_派生的
的数据块(因为继承不是编译时,而是运行时)。那么,当您使用该指针调用
SayBello
时会发生什么?这将是未定义的行为。你看到问题了吗


<>这就是为什么你不能做它(逻辑上,也使用C++风格的铸造)。< / P > P你不能,你不应该。原因很简单。看看这个代码

类基{
公众:
Base(){}
虚拟void SayHello(){}
};
A类:公共基础{
公众:
A_派生(){}
虚拟void SayHello()重写{…}
void SayAllo(){…}
};
B_类派生:公共基{
公众:
B_派生(){}
虚拟void SayHello()重写{…}
void SayBello(){…}
};
现在,当我们将
A_-Derived
类指针指定给
B_-Derived
时,编译器将允许调用
SayBello
方法。这是因为对于编译器来说,它是一个
B_派生的
类指针,它不知道实际的指针数据指向
a_派生的
的数据块(因为继承不是编译时,而是运行时)。那么,当您使用该指针调用
SayBello
时会发生什么?这将是未定义的行为。你看到问题了吗


这就是为什么你不能做到这一点(逻辑上也使用C++风格的铸造)。

没有一个有效的方法来做这一个简单的原因——在类继承结构中,类的一个对象<代码> a < /> >也不能是类<代码> c<代码>的对象。在C++中,两个不同类型的对象可以具有相同的地址,当且仅当其中一个对象是另一个对象的子对象时,这不是你的情况。如果将指向
a
的指针强制转换为指向
C
的指针,指针仍将引用类型为
a
的对象,取消引用强制转换的指针将导致未定义的行为

很可能,您要做的是从类
A
的对象创建类
C
的对象。您可以使用或来实现这一点


请注意,如果您真正想要的是重用为
A
类型的对象分配的存储,则仍然需要先销毁对象
A
,然后构建对象
C
。在销毁
A
之前,您必须先保存
A
中的任何相关数据,才能使用数据构建
C

没有有效的方法来实现这一点,原因很简单-在类继承结构中,类
A
的对象不能同时也是类
C
的对象。在C++中,两个不同类型的对象可以具有相同的地址,当且仅当其中一个对象是另一个对象的子对象时,这不是你的情况。如果将指向
a
的指针强制转换为指向
C
的指针,指针仍将引用类型为
a
的对象,取消引用强制转换的指针将导致未定义的行为

很可能,您要做的是从类
A
的对象创建类
C
的对象。您可以使用或来实现这一点

请注意,如果您真正想要的是重用为
A
类型的对象分配的存储,则仍然需要先销毁对象
A
,然后构建对象
C
。在销毁
A
之前,您必须保存
A
中的任何相关数据,以便能够使用数据构建
C

有没有办法将对象动态更改为另一种类型

不可以。对象的类型在其生存期内无法更改

假设我有一个从父类B继承的类a,还有另一个从类B继承的类C。有没有办法在运行时将类a的指针更改为类C

class A : public B {
    A::someFunction() {
        //can I change this pointer to class C here?
    }
}

class C : public B {
    ...
}
没有

充其量,您可以销毁原始对象,并重用其内存来创建另一个对象。显然,内存的大小和对齐方式必须足以容纳新类型。任何对旧对象的引用(包括成员函数中的
this
等指针)都将因原始对象的破坏而失效。存储的重用是一个高级主题,我不推荐初学者使用

有没有办法将对象动态更改为另一种类型

不可以。对象的类型在其生存期内无法更改

假设我有一个从父类B继承的类a,还有另一个从类B继承的类C。有没有办法在运行时将类a的指针更改为类C

class A : public B {
    A::someFunction() {
        //can I change this pointer to class C here?
    }
}

class C : public B {
    ...
}
没有

充其量,您可以销毁原始对象,并重用其内存来创建另一个对象。显然,内存的大小和对齐方式必须足以容纳新类型。对旧对象的任何引用(包括成员函数中的
this
等指针)都将因