想象一下这段代码:
class Base {
public:
virtual void foo(){}
};
class Derived: public Base {
public:
int i;
void foo() override {}
void do_derived() {
std::cout << i;
}
};
int main(){
Base *ptr = new Base;
Derived * static_ptr = static_cast<Derived*>(ptr);
static_ptr->i = 10; // Why does this work?
static_ptr->foo(); // Why does this work?
return 0;
}
为什么我在控制台上得到结果 10?我想知道,因为我认为 ptr 是指向基础对象的指针。因此该对象不包含 int i 或方法 do_derived()
。是否会自动生成新的派生对象?
当我也在 Base 类中声明了一个虚拟的 do_derived()
方法时,选择了这个,但是为什么呢?
最佳答案
int* i = new int{1};
delete i;
std::cout << *i << std::endl;
如果工作的定义是代码将编译和执行,这也将“工作”。
但是,这显然是未定义的行为,并且无法保证会发生什么。
在您的情况下,代码编译为 static_cast
不会执行任何检查,它只是转换指针。访问尚未分配和初始化的内存仍然是未定义的行为。
关于c++ - 为什么这个静态 C++ 强制转换有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069209/