我试图弄清楚为什么我不能用另一个子类对象覆盖子类对象,如果它们共享基类的话。
说 Letter 是基类。 A 和 B 是子类。以下似乎不起作用:
Letter* a_p = new A();
Letter* b_p = new B();
delete a_p;
*a_p = *b_p;
我的目标是改变位于某个地址的内容,以便所有指向该地址的指针都会改变他们所指向的内容。在上面的例子中,我想以某种方式将a_p的“内容”改为b_p的“内容”副本。
这有可能吗?
答案 0 :(得分:4)
如果您正在复制对象并且指针的类型是基类,则会丢失有关子类的所有信息。
由于您删除了a_p,因此*a_p=
错误,因为a_p
指向的内存不再分配。
为什么不这样做:a_p = b_p;
?
答案 1 :(得分:2)
在您给出的示例代码中,最突出的错误是您取消引用先前删除的指针。但是我们可以说这些是堆栈中的对象;
class Base
{
};
class A : public Base
{
};
class B : public Base
{
int a;
};
int main()
{
A a;
B b;
b = a; // This gives an error
return 0;
}
我们正在尝试将A
对象复制到B
对象中,该对象具有不同的内存布局(添加的int成员)。你认为那个成员怎么会被初始化?出于同样的原因,您不能指向A
指向B
对象的指针,它们是不同的类型。
这两种类型“相同”的唯一地方是通过Base
指针访问它们的位置。
答案 2 :(得分:1)
A和B在内存中的大小可能不同。 此外,删除处理为a_p分配的内存。 你会写到未分配的内存。这会导致'未定义的行为'
答案 3 :(得分:0)
如果你想分配指针值,我认为你是,那么你需要做
a_p = b_p
不是*a_p = *b_p