C++ 为什么使用static\u cast操作符的不安全cast不会崩溃?

C++ 为什么使用static\u cast操作符的不安全cast不会崩溃?,c++,casting,static-cast,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() {

考虑以下示例代码

#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
}

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

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


在我见过的大多数编译器上,调用不访问
NULL
指针上的类成员的非
virtual
方法是可行的,但它仍然是未定义的。

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


<>在大多数编译器中,我调用了一个不在代码< > NULL> <代码>指针下访问类成员的非->代码>虚拟/代码>方法,但它仍然未定义。

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


这种未定义的行为包括默默地做你认为正常的行为。没有一个分割故障或任何其他诊断的保证。

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


这种未定义的行为包括默默地做你认为正常的行为。无法保证出现分段错误或任何其他诊断。

坏代码比好代码更难理解。@David:能否请您详细说明一下?可能重复@LinuxPenseur:理解坏代码需要非常深入地理解编译器做出的实现决策。好代码是精心构造的,其行为独立于那些决定。坏代码比好代码更难理解。@大卫:请详细说明一下好代码?可能重复@LinuxPenseur:理解坏代码需要对编译器做出的实现决定有非常深刻的理解。好的代码是精心构建的,以使行为独立于这些决策。
derived::func()
derived::func()