据我了解,使用引用的多态应该与使用指针的多态完全相同。
但请考虑以下示例:当使用指针时,对doer()
的调用被正确地派发,但在使用引用时,"B版本"似乎在两种情况下都被调用。
我无法弄清楚为什么以下示例的行为方式如此。为什么在使用引用时两种情况下都调用" B版本"?
#include <iostream>
class B;
class C;
void doer(B *x) {
std::cout << "B version" << std::endl;
}
void doer(C *x) {
std::cout << "C version" << std::endl;
}
class A {
public:
virtual ~A() {}
virtual void doit() = 0;
};
class B: public A {
public:
virtual void doit() override {
doer(this);
}
};
class C: public A {
public:
virtual void doit() override {
doer(this);
}
};
int main() {
B b;
C c;
A *a = &b;
a->doit(); // B version gets called, OK
a = &c;
a->doit(); // C version is called, OK
A &d = b;
d.doit(); // B version is called, OK
d = c;
d.doit(); // B version is called again??
}
d = c
不会重新分配引用。它在A
上调用了复制赋值运算符。 - David G