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()