1

最初に2つのコードがあります:

#include<iostream>
using namespace std;

class A{
  public:
     virtual void  f()
    {
      cout<<"A"<<endl;
    }
};
class B: public A{
  public:
    virtual void  f()
    {
      cout<<"B"<<endl;
    }
};
int main()
{
  A* pa=new A();
  B* pb=new B();
  A* upCastpa= static_cast<A*>(pb);
  B* downCastpb=static_cast<B*>(pa);
  upCastpa->f();
  downCastpb->f();
  return 1;
}

1つのディスプレイ

B
A

したがって、本当に重要なのは、ポインタが指しているオブジェクトに反対していることだと思います。ただし、次のように仮想フォームA :: f()を削除すると、

#include<iostream>
using namespace std;

class A{
  public:
     void  f()
    {
      cout<<"A"<<endl;
    }
};
class B: public A{
  public:
    virtual void  f()
    {
      cout<<"B"<<endl;
    }
};
int main()
{
  A* pa=new A();
  B* pb=new B();
  A* upCastpa= static_cast<A*>(pb);
  B* downCastpb=static_cast<B*>(pa);
  upCastpa->f();
  downCastpb->f();
  return 1;
}

コードは「停止」と表示されます何が起こったのですか?重要なことは、ポインタが指しているオブジェクトに反対している場合。

破損ではなくABを表示することを想定しています。

どうした?

アドバイスや指示をいただければ幸いです。どうもありがとう。

4

3 に答える 3

2

機能の有無に関係なくvirtual

A* pa=new A(); 
B* downCastpb=static_cast<B*>(pa); 

未定義動作を引き起こします。

static_castオブジェクトをそうでないタイプにキャストするために使用すると、未定義動作が発生します。未定義の動作を生成するコードを作成したら、観察された出力の理由を見つけようとしても意味がありません。コンパイラは、動作、クラッシュ、奇妙な結果、または非常に正常に機能するコードを自由に表示できます。あなたは完全にコンパイラに翻弄されます。

参照:

C++11標準5.2.9[expr.static.cast]

クラスタイプである「 pointertocv1 B」タイプのprvalueは、「pointer to 」から「pointer」への有効な標準変換の場合、から派生したクラスである「 pointertocv2Bタイプのprvalueに変換できます。 「存在する場合、cv2はcv1同じまたはそれ以上のcv-qualificationであり 、の仮想基本クラスでも、の仮想基本クラスの基本クラスでもありません。nullポインター値は、宛先タイプのnullポインター値に変換されます。タイプ「ポインタからcv1」のprvalueの場合 DDBDBBDD BBD、結果のポインタは、タイプ。の囲んでいるオブジェクトを指しますD。それ以外の場合、キャストの結果は未定義です。

于 2012-10-18T14:08:43.510 に答える
0

これはポリモーフィズムです。virtual void f()基本クラスAに書き込みvoid f()、継承クラスBに書き込む必要があります

于 2012-10-18T14:03:02.957 に答える
0

最初のを削除することvirtualで、vtableに入るのを効果的に防ぐことができます。これは、クラスAのvtableが空になったことを意味します。ただし、クラスBには仮想関数があるため、vtableにエントリがあります。

したがって、をにダウンキャストしA*B*から呼び出すと、呼び出しは空のvtable内fの関数を探します。fそれが見つからない場合は、コードの破損について不平を言うでしょう。

実際には、一般的なケースでは、例1も機能しません。この特定のケースで機能する理由は、とのvtableABまったく同じであるためです。

于 2012-10-18T14:04:18.037 に答える