C++ 静态_cast是否正在创建新的子对象?

C++ 静态_cast是否正在创建新的子对象?,c++,pointers,inheritance,casting,static-cast,C++,Pointers,Inheritance,Casting,Static Cast,由于我没有实例化派生类对象,这段代码在出现运行时错误时运行良好 #include <iostream> using namespace std; class Person { public: void walk() { cout << "person walking" << endl; } }; class Employee :public Person { public: void work() { cout <&

由于我没有实例化派生类对象,这段代码在出现运行时错误时运行良好

#include <iostream>
using namespace std;

class Person {
public:
    void walk() { cout << "person walking" << endl; }
};
class Employee :public Person {
public:
    void work() { cout << "employee working" << endl; }
};
void main() {
    Person* p = new Person();
    Employee* e = static_cast<Employee*>(p); 
    e->work();// this is working - but why? it should fail at runtime
}
#包括
使用名称空间std;
班主任{
公众:
void walk(){coutNo


不幸的是,您关于代码应该“在运行时崩溃”的断言是错误的。您的代码表现出未定义的行为,这意味着它可以做任何事情。在这种情况下,我希望它可以工作,因为函数的地址在两个对象中是相同的,但实际上,它可能是出于任何原因。

“它应该在运行时失败”为什么要这样?未定义的行为是未定义的。这可以包括“根据某种定义,似乎‘起作用’”main应该返回
int
,而不是
void
。这必须是最常见的新手假设之一,即无效程序必须产生运行时错误。在公平的世界中,这是正确的,但世界并不公平,而且只有在无效程序可能产生运行时错误的情况下。现在,向添加一个百万
int
的数组如果您对代码崩溃感兴趣,请删除Employee
,并尝试将其清除为零,看看效果如何。您的代码存在内存泄漏,每个
新的
都必须有
delete
。两个方法都不能访问它们正在被调用的对象。请让它们使用
this
指针访问成员数据和y你更可能看到副作用发生,其中可能包括预期的碰撞。