请看下面的简单代码:
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 呢?
任何合乎逻辑的答案将不胜感激。