次のコードでは
#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番目の実装を呼び出さないのでしょうか。
式の静的型*a
はA
、次のようa
に宣言されているためです。
A* a = new B;
コンパイラーは、引数の静的型を使用して、オーバーロードされた関数の選択を解決します。
仮想関数が呼び出された場合でも、コンパイラはオブジェクトの静的型を使用して適切な関数を呼び出します。違いは、コンパイラが仮想関数へのポインタのテーブルを使用して、必要な関数を間接的に呼び出すことだけです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加