假设我有一个简单的类层次结构,如下所示,带有一个通用 api:
#include <memory>
class Base {
public:
void api() {
foo();
}
protected:
virtual void foo() {
std::cout << "Base" << std::endl;
}
};
class FirstLevel : public Base {
protected:
virtual void foo() {
std::cout << "FirstLevel" << std::endl;
}
};
当我使用基类指针时,我得到正确的调度如下:
std::shared_ptr<Base> b = std::make_shared<Base>();
std::shared_ptr<Base> fl = std::make_shared<FirstLevel>();
b->api();
fl->api();
哪个正确打印:
Base
FirstLevel
但是,当我使用基类引用时,行为出乎意料:
Base &b_ref = *std::make_shared<Base>();
Base &fl_ref = *std::make_shared<FirstLevel>();
b_ref.api();
fl_ref.api();
打印:
FirstLevel
FirstLevel
为什么使用引用而不是指针时调度不同?