常规强制转换不会引发运行时错误

时间:2012-09-25 17:00:02

标签: c++ inheritance casting static-cast

如果我们看到下面的代码,fun函数将C的对象转换为B的对象并调用B'自己的函数。它怎么不给segm错误。我认为这会导致崩溃。 我的程序没有崩溃。任何人都可以解释为什么它能正常工作。

#include<iostream>
using namespace std;
class A{
public:
   A() {cout<<"A's Con\n"; }
   ~A() {cout<<"A's De\n"; }
};
class B :public A
{
public:
   B() {cout<<"B's Con\n"; }
   ~B() {cout<<"B's De\n"; }
   void printb(){cout<<"B print function\n";}
   void printb2(){cout<<"B print2 function\n";}
};
class C :public A
{
public:
   C() {cout<<"C's Con\n"; }
   ~C() {cout<<"C's De\n"; }
   void printc(){cout<<"C print function\n";}
};
void fun(A *ap)
{
   B *bp = (B*) ap;
   bp->printb2();
}

int main()
{
   C c;
   fun(&c);
   return 0;
}

1 个答案:

答案 0 :(得分:2)

您正在调用未定义的行为。关于未定义行为的第一条规则是任何事情都可能发生。您的程序可能会崩溃,或者它可能会成功运行。它可能出现成功地工作,然后以“不可能”的方式在几小时后崩溃。它甚至可能会向您的老板发送不适当的电子邮件或删除您的硬盘。对于一个随机的良性错误来说,这当然不太可能,但如果你的程序是一个网络浏览器,它当然可以被利用来做任何攻击者可能想要的事情。

永远不要依赖未定义的行为。始终解决下属问题。使用ValgrindApplication Verifier等工具来帮助您捕捉并非总是导致崩溃的细微错误。从长远来看,它将使您的软件更加可靠。