虚函数问题

时间:2011-01-28 06:58:02

标签: 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;
  }
};

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

int main() {
  y  a;

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

  x* c = &a;
  c->hello(); // prints y
  return 0;
}

4 个答案:

答案 0 :(得分:6)

是的,你是对的

x b = a;

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

x& b = a;

指定一个引用并使用覆盖(b实际上仍然是'y')

答案 1 :(得分:6)

因为x b = a; slices是对象。

当此代码执行时,它会创建一个新的x,而不是y,它是原始ya'的副本。

答案 2 :(得分:0)

x b = a将a复制到b。由于b是类型x,因此最终得到x类型的对象。 x类型的对象将打印x。

获得y的唯一方法是调用y类型的对象。

答案 3 :(得分:0)

b.hello()打印“x”,因为b是类X的实例。c->hello()打印“y”,因为c指向a,{ {1}}是Y类的实例。

可能让您感到困惑的是,当您撰写a时,您正在创建新对象x b = a;并使用b对其进行初始化。当您编写a时,x* c = &a;不是新对象。您刚刚为现有对象引入了别名。