c++ - 为什么这个静态 C++ 强制转换有效?

标签 c++ casting

想象一下这段代码:

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/

相关文章:

c++ - 如何从主类中调用 C++ 中的函数?

C++ 命名管道 WriteFileEx/ReadFile, unicode/ansi

c++ - g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps)?

c++ - 自动为 Qt 配置套件

c++ - 显式转换、直接初始化和复制初始化之间的不同行为

c - 奇怪的指针行为

c# - 区分两个类

c++ - 为可变参数模板中给定的所有类型添加模板特化

java - 我什么时候必须沮丧一些事情?

mysql - 在同一调用中将列转换为不同类型