试图找出一些东西(实际上是在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/