gpt4 book ai didi

c++ - 用父类(super class)的实例覆盖子类的实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:53 26 4
gpt4 key购买 nike

为了解决问题(实际上是在 Ada 中),我想出了以下代码。为什么它是合法的?

class Superclass {
public:
virtual void Announce() {
printf("I am the superclass\n");
}
};

class Subclass : public Superclass {
public:
void Announce() {
printf("I am the subclass\n");
}
};

int main() {
Superclass osuper;
Subclass osub;

Superclass* p = &osub;
*p = osuper;
osub.Announce();

return 0;
}

main() 中,我创建了一个 Subclass 的实例,然后用 Superclass 的实例物理覆盖它。然后,我在被覆盖(并因此损坏)的对象上成功调用了 Subclass 的方法。

我不能直接分配 osub = osuper,因为那没有意义,但通过指针我似乎绕过了它。上面的代码编译正常,没有警告,但是当我调用 osub.Announce() 时,osub 中的内存不再包含有效的 Subclass 对象。

这不可能是类型安全的(或者甚至是通常安全的),但编译器似乎非常满意。为什么?

最佳答案

在对象上使用 = 运算符不是无效的,它不会覆盖任何东西,将使用默认的复制构造函数。如果你想真正覆盖内存中的对象,试试memcpy(p, &osub, sizeof(Superclass))。现在这将是一个覆盖:)

参见 http://www.cplusplus.com/articles/y8hv0pDG/

关于c++ - 用父类(super class)的实例覆盖子类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25379222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com