使用超类的实例覆盖子类的实例

Dav*_*ven 4 c++ types casting

试图找出一些东西(实际上是在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;
}
Run Code Online (Sandbox Code Playgroud)

main(),我创建一个实例Subclass,然后用一个实例覆盖它Superclass.然后,我成功调用了一个Subclass覆盖(和如此损坏)对象的方法.

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

这可能不是类型安全的(甚至,通常是安全的),但编译器似乎非常高兴.为什么?

小智 6

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

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