动态绑定和虚函数 - Vector of base class objects, access the "correct" member function

Dynamic binding and virtual functions - Vector of base class objects, access the "correct" member function

我是 c++ 的新手,我正在尝试尽可能多地了解该语言和底层机制。

我对一个特定情况感到困惑,当我有两个 类(基础和派生)时,我似乎无法访问正确的成员函数,即使我将它们定义为虚拟。

class Base {
  public:
  virtual void print() { std::cout << "Base" << std::endl; };
};

class Derived : public Base {
  public:
  virtual void print() { std::cout << "Derived" << std::endl; };
};

int main() {

  Base b;
  Derived d;

  b.print();
  d.print();

  Base* p1 = &b;
  Base* p2 = &d;

  p1->print();
  p2->print();

  std::vector<Base> v { b, d };

  v[0].print();
  v[1].print(); // Why doesn't this print "Derived?"

  return 0;
}

输出:

Base
Derived
Base
Derived
Base
Base <- ??

virtual 似乎对 Base 类型的指针“起作用”,但不适用于 vector<Base>.

中的对象

怎么回事?

因为对象切片。当您创建矢量时,您将对象复制到其中。

std::vector<Base> v{ b, d };

要注意的是,在 std::vector 中,您只有 BaseNOT BaseDerived 类型的对象.如果你想在 C++ 中使用容器的多态行为,你通常使用指针来实现,因为你不能在其中保留原始引用。

std::vector<Base*> v{ &b, &d };
for (Base* ptr : v) {
    ptr->print();
}