为什么使用static_cast运算符的不安全强制转换不会崩溃?

nit*_*ian 1 c++ casting static-cast

请考虑以下示例代码.

#include <iostream>

using namespace std;

class base
{

   public:
       void func()
      {
         cout << "base::func()" << endl;
      }

};

class derived : public base
{
   public:
       void func()
      {
         cout << "derived::func()" << endl;
      }

};

void dummy(base *bptr)
{
  derived *dptr = static_cast<derived*> (bptr);
  dptr->func();
}

int main()
{
   base bob1;
   derived dob1;

   dummy(&dob1); //Line1
   dummy(&bob1); //Line2
}
Run Code Online (Sandbox Code Playgroud)

在Line1中,我将派生类对象的地址传递给函数dummy,该函数接受指向基类对象的指针.所以static_cast在功能上dummy是安全的.

在Line2中,我将基类对象的地址传递给函数.所以static_cast在功能上dummy是不安全的.

但是当我执行代码时,程序运行正常.我想,通过这个词not safe,程序应该在运行时崩溃.但没有发生崩溃.

这是我得到的输出.

derived::func()
derived::func()
Run Code Online (Sandbox Code Playgroud)

程序在运行时没有崩溃的原因是什么?

Luc*_*ore 10

因为未定义的行为意味着任何事情都可能发生,不一定是崩溃.

在我看过的大多数编译器中,调用一个virtual不能访问NULL指针上的类成员的非方法,但它仍未定义.


thi*_*ton 6

C++的核心概念之一是未定义的行为.当您执行导致未定义行为的操作时,例如静态转换指向未指向转换类型对象的指针时,程序的行为实际上是未定义的:标准不定义任何特定行为.平台不需要做任何特定的事情,根据标准,它显示的任何行为都可以.

这种未定义的行为包括默默地对你做正常行为.无法保证分段故障或任何其他诊断.