子类覆盖c ++

时间:2013-01-02 17:50:04

标签: c++ dynamic subclass overwrite

我试图弄清楚为什么我不能用另一个子类对象覆盖子类对象,如果它们共享基类的话。

Letter 是基类。 A B 是子类。以下似乎不起作用:

Letter* a_p = new A();
Letter* b_p = new B();

delete a_p;
*a_p = *b_p;

我的目标是改变位于某个地址的内容,以便所有指向该地址的指针都会改变他们所指向的内容。在上面的例子中,我想以某种方式将a_p的“内容”改为b_p的“内容”副本。

这有可能吗?

4 个答案:

答案 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