で仮想関数X
を宣言し、派生クラスでB(B::X)
オーバーライドします。とのパラメーター リストが異なり、異なると見なされる場合、はオーバーライドされず、仮想ではありません (virtual キーワードで宣言した場合を除きます)。代わりに、非表示にします。X
D(D::X)
B::X
D::X
B::X
D::X
D::X
B::X
D::X
D::X
B::X
#include <iostream>
using namespace std;
struct B {
virtual void X() { cout << "Class B" << endl; }
};
struct D: B {
void X(int) { cout << "Class D" << endl; }
};
int main() {
D d;
B* pb = &d;
// d.X();
pb->X();
}
を呼び出すことさえできません。d.X()
によって隠されていD::X(int)
ます。しかしpb->X()
、大丈夫です。
だからあなたの場合:
struct B {
virtual void X(B& b) { cout << "Class B" << endl; }
};
struct D: B {
void X(B& b) { cout << "Class D" << endl; }
void X(D& d) { cout << "Class D" << endl; }
};
はD::X
を非表示にしB::X
ます。Sod1.X(d2)
とd1.X(b2)
intest()
は とは何の関係もありませんB::X
。And b1.X(d2)
、 andb1.X(b2)
でtest()
を呼び出しますD::X
。はB::X
D では見えませんが、virtual キーワードでD::X(B&)
宣言するかどうかに関係なく仮想です。D::X(B&)
コンパイラはそれが仮想関数であることを認識しているためD::X(B&)
、呼び出されます。
編集: b1.X(b2) の詳細説明、B::X は仮想関数であり、D::X はそれをオーバーライドするため、動的バインディングによって確実に D::X が呼び出されます。また、オーバーロードはコンパイル時に決定されるため、D::X(D&) は呼び出されません。