C ++でのアーリーバインディングとレイトバインディング+ポリモーフィズム

スタック

Hello関数がなく、mainでob.displayを呼び出すだけで、クラスAではなくクラスBのdisplay関数を呼び出すとします。

関数display()の呼び出しは、基本クラスで定義されたバージョンとしてコンパイラーによって一度設定されています。これは、関数呼び出しの静的解決、または静的リンケージと呼ばれます。関数呼び出しは、プログラムが実行される前に修正されます。これは、プログラムのコンパイル中にdisplay()関数が設定されるため、アーリーバインディングと呼ばれることもあります。

では、基本クラスの表示関数の前に仮想キーワード(遅延バインディング)を使用せずに、派生クラスの表示関数を呼び出すにはどうすればよいでしょうか。

このプログラムでは、オブジェクトを値による呼び出し、ポインターによる呼び出し、およびHello関数への参照による呼び出しとして渡すことが正常に機能します。ここで、ポリモーフィズムを使用し、派生クラスのメンバー関数が呼び出された場合にそれを表示する場合は、ベースの表示関数の前に仮想キーワードを追加する必要があります。ポインタによる呼び出しと参照による呼び出しによってオブジェクト値を渡す場合、派生クラスの関数を呼び出しますが、値によってオブジェクトを渡す場合、それはなぜそうではありませんか?>

class A
{
   public:
      void display();                       // virtual void display()
       {
        cout << "Hey from A" <<endl;
       }
};

class B : public A
{
    public:
        void display()
        {
            cout << "Hey from B" <<endl;
        }
};

void Hello(A ob) // &ob  //*ob
{
   ob.display();       // ob->display()
}

int main()
{
    B obj;
    Hello(obj); // obj   //&ob
    return 0;
} 
マイクシーモア

では、基本クラスの表示関数の前に仮想キーワード(遅延バインディング)を使用せずに、派生クラスの表示関数を呼び出すにはどうすればよいでしょうか。

非仮想関数は、呼び出されたオブジェクト(または参照またはポインター)の静的型に応じて、コンパイラーによって単純に解決されます。したがって、派生型のオブジェクトとそのサブオブジェクトへの参照が与えられます。

B b;
A & a = b;

非仮想関数を呼び出すと、異なる結果が得られます。

b.display();  // called as B
a.display();  // called as A

実際のタイプがわかっている場合は、そのバージョンを呼び出すように指定できます。

static_cast<B&>(a).display();  // called as B

しかし、a参照するオブジェクトにタイプがない場合、それはひどく間違ってしまいますB

ここで、ポリモーフィズムを使用し、派生クラスのメンバー関数が呼び出された場合にそれを表示する場合は、ベースの表示関数の前に仮想キーワードを追加する必要があります。

正しい。関数を仮想化すると、別のタイプの参照またはポインターを使用してアクセスする場合でも、オブジェクトの動的タイプに従って実行時に解決されます。したがって、上記の両方の例では、これをと呼びますB

ポインタによる呼び出しと参照による呼び出しによってオブジェクト値を渡すと、派生クラスの関数が呼び出されますが、値によってオブジェクトを渡すと、なぜそうならないのでしょうか。

値で渡すと、スライスすることになります。Aオブジェクト一部だけをコピーして、タイプが新しいオブジェクトを作成しますAしたがって、関数が仮想であるかどうかに関係なく、そのオブジェクトで関数を呼び出すとAバージョンが選択されますAこれは、であり、に過ぎないためAです。

参照またはポインタを渡す場合でも、動的タイプの元のオブジェクトにアクセスしていますBしたがって、仮想関数呼び出しはBバージョンに解決されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

vtableのc ++アイデアのポリモーフィズム(動的バインディング)

分類Dev

C ++デザインとポリモーフィズム

分類Dev

ウィンドウの下のCでのデータのバイト表示。ビッグエンディアンとリトルエンディアン

分類Dev

C#ポリモーフィズム+ジェネリックデザイン-アドバイスが必要

分類Dev

C#でのリモート/オンラインmysqlとのWPFデータグリッドバインディング

分類Dev

スプリングフォーム:c:forEach内のフォームデータバインディング

分類Dev

backgroundworkerでのC#ProgressBarデータバインディング

分類Dev

Datagridview C#でのデータバインディング

分類Dev

CのOOポリモーフィズム、エイリアシングの問題?

分類Dev

C ++のポリモーフィズム

分類Dev

C#ユニバーサルアプリ-クリック時のデータバインディング

分類Dev

c#データセットへのDatagridviewバインドをフィルタリングする方法-アクセントインセンティブ

分類Dev

ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

分類Dev

CバインディングでコードをインポートするPickleモジュール

分類Dev

C ++バイナリツリーパスファインディング

分類Dev

C / Pythonバインディング:ポインターアドレスの変更

分類Dev

データバインディング、トリガー、コマンドを使用する理由-C#とWPF

分類Dev

C ++インターフェース、継承、ポリモーフィズム

分類Dev

C#とXAML間の双方向データバインディングの更新

分類Dev

C#でのデータバインディングと静的テキストの連結

分類Dev

C#Wpfバインディングタイプのアダプター

分類Dev

c# uwp テンプレートバインディングと依存関係プロパティ

分類Dev

C ++ライブラリのC#バインディング

分類Dev

バインディングC-; プレフィックスキーとしてEmacsで

分類Dev

C#BlazorとDateTimeへのデータバインディング?

分類Dev

C、Linuxのディレクトリとファイルの再帰的リストでのセグメンテーション違反(コアダンプ)

分類Dev

AngularJSのC3.jsでの双方向データバインディング

分類Dev

C ++バインディングのFirebase自動ログイン(初回ログイン)ワークフロー

分類Dev

C2HSで生成されたCバインディングのリンカーエラー

Related 関連記事

  1. 1

    vtableのc ++アイデアのポリモーフィズム(動的バインディング)

  2. 2

    C ++デザインとポリモーフィズム

  3. 3

    ウィンドウの下のCでのデータのバイト表示。ビッグエンディアンとリトルエンディアン

  4. 4

    C#ポリモーフィズム+ジェネリックデザイン-アドバイスが必要

  5. 5

    C#でのリモート/オンラインmysqlとのWPFデータグリッドバインディング

  6. 6

    スプリングフォーム:c:forEach内のフォームデータバインディング

  7. 7

    backgroundworkerでのC#ProgressBarデータバインディング

  8. 8

    Datagridview C#でのデータバインディング

  9. 9

    CのOOポリモーフィズム、エイリアシングの問題?

  10. 10

    C ++のポリモーフィズム

  11. 11

    C#ユニバーサルアプリ-クリック時のデータバインディング

  12. 12

    c#データセットへのDatagridviewバインドをフィルタリングする方法-アクセントインセンティブ

  13. 13

    ポリモーフィズムとC ++のクラステンプレートからのメソッドのオーバーライド

  14. 14

    CバインディングでコードをインポートするPickleモジュール

  15. 15

    C ++バイナリツリーパスファインディング

  16. 16

    C / Pythonバインディング:ポインターアドレスの変更

  17. 17

    データバインディング、トリガー、コマンドを使用する理由-C#とWPF

  18. 18

    C ++インターフェース、継承、ポリモーフィズム

  19. 19

    C#とXAML間の双方向データバインディングの更新

  20. 20

    C#でのデータバインディングと静的テキストの連結

  21. 21

    C#Wpfバインディングタイプのアダプター

  22. 22

    c# uwp テンプレートバインディングと依存関係プロパティ

  23. 23

    C ++ライブラリのC#バインディング

  24. 24

    バインディングC-; プレフィックスキーとしてEmacsで

  25. 25

    C#BlazorとDateTimeへのデータバインディング?

  26. 26

    C、Linuxのディレクトリとファイルの再帰的リストでのセグメンテーション違反(コアダンプ)

  27. 27

    AngularJSのC3.jsでの双方向データバインディング

  28. 28

    C ++バインディングのFirebase自動ログイン(初回ログイン)ワークフロー

  29. 29

    C2HSで生成されたCバインディングのリンカーエラー

ホットタグ

アーカイブ