次の簡単なコードをご覧ください。
class A
{
public:
A() {}
virtual bool cmp(const A& a) const {cout << "cmp A" << endl; return true;}
};
class B : public A
{
public:
B() {}
~B() {}
bool cmp(const B& b) const {cout << "cmp B" << endl; return false;;}
};
int main()
{
A a1;
A a2;
B b1;
B b2;
a1.cmp(a2); // as expected
b1.cmp(b2); // as expected
a1.cmp(b1); // upcasting
// b2.cmp(a2); // conversion needed
// Here is the problematic part:
A* pa;
pa = new B;
pa -> cmp (b1); // Why why why the cmp of A runs?
return 0;
}
私はそれを理解できません.vptrとvtbl、およびキャストなしで呼び出しに正確に一致する関数があります。では、なぜクラス A の cmp が呼び出されるのでしょうか。
論理的な答えは大歓迎です。