C ++で基本クラスへのポインターが与えられたときに、派生クラスオブジェクトのオーバーロードされた関数が呼び出されないのはなぜですか?

ガブリン

次のコードでは

#include <iostream>
using namespace std;

class A {
  public:
    A() {}
    virtual ~A() {};
};

class B : public A {
  public:
    B() {}
    virtual ~B() {};
};

void process(const A&) {
    cout << "processing A" << endl;
}

void process(const B&) {
    cout << "processing B" << endl;
}

int main(void) {
    A* a = new B;
    process(*a);
    return 0;
}

それを実行した結果は次のようになります

processing A

しかし、私はそれがあったはずだと思っていたでしょう

processing B

aは派生クラスB指しているので、ではありませんAでは、なぜprocess関数の最初の実装を呼び出し、2番目の実装を呼び出さないのでしょうか。

モスクワ出身のヴラド

式の静的型*aA、次のようaに宣言されているためです。

A* a = new B;

コンパイラーは、引数の静的型を使用して、オーバーロードされた関数の選択を解決します。

仮想関数が呼び出された場合でも、コンパイラはオブジェクトの静的型を使用して適切な関数を呼び出します。違いは、コンパイラが仮想関数へのポインタのテーブルを使用して、必要な関数を間接的に呼び出すことだけです。

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

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

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ