虚函数问题

Mar*_*lon 7 c++ virtual-functions

我有两节课:

class x {
public:
  virtual void hello() {
    std::cout << "x" << std::endl;
  }
};

class y : public x {
public:
  void hello() {
    std::cout << "y" << std::endl;
  }
};
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么以下两个调用hello()打印不同的消息?他们为什么不打印"y"?是因为第一个是副本而第二个实际指向内存中的对象?

int main() {
  y  a;

  x b = a;
  b.hello(); // prints x

  x* c = &a;
  c->hello(); // prints y
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 6

是的,你是对的

x b = a;
Run Code Online (Sandbox Code Playgroud)

调用复制构造函数(b IS为'x')

x& b = a;
Run Code Online (Sandbox Code Playgroud)

分配引用并使用覆盖(b实际上仍然是'y')


Joh*_*ing 6

因为x b = a; 切片对象.

当这段代码执行时,它会创建一个新的x,而不是a y,它是原始的副本y,a'.