C++虚方法混淆

Sve*_*ger 1 c++ methods virtual inheritance

我有一个关于继承和虚方法的基本C++问题.

请考虑以下代码:

#include <iostream>
#include <vector>
using namespace std;

class A {
public:
  virtual void f() {cout << "A\n";};
};

class B : public A {
public:
  void f() {cout << "B\n";};
};

int main() {
  A a;
  B b;
  vector<A> v;
  v.push_back(a);
  v.push_back(b);

  for (int i = 0; i < v.size(); ++i)
    v.at(i).f();
}
Run Code Online (Sandbox Code Playgroud)

如果我执行此代码,它会打印出来

A
A
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不打印

A
B
Run Code Online (Sandbox Code Playgroud)

因为"f"方法被声明为虚拟.我想知道为什么程序以这种方式运行.

提前致谢

jua*_*nza 6

您的向量包含A对象:

vector<A> v;
Run Code Online (Sandbox Code Playgroud)

当您将B对象推入其中时,向量会将其中的A一部分复制到新A对象中.它相当于这样做:

A a;
B b;
a = b;
a.f();
Run Code Online (Sandbox Code Playgroud)

这称为对象切片.