【发布时间】:2015-03-01 19:30:57
【问题描述】:
据我了解,引用的多态性应该与指针的工作方式完全相同。
但是,请考虑以下示例:使用指针时正确分派了对 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上调用复制赋值运算符。
标签: c++ inheritance polymorphism