从基类调用重写的方法

jam*_*tha 15 c++ methods overriding

假设我有以下课程:

class A {
 public:
  virtual void foo() {
    bar();
  }

 protected:
  virtual void bar() {
    // Do stuff
  }
}

class B : public A {
 protected:
  virtual void bar() {
    // Do other stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个B实例并调用foo方法,那么会调用哪个bar方法?这个编译器是否具体?

谢谢

das*_*ght 22

A::foo会称B::bar,如果你有一个实例B.如果通过指针或对基类的引用引用实例并不重要:无论如何,B都调用了版本; 这就是使多态调用成为可能的原因.该行为不是特定于编译器的:虚函数根据标准以这种方式运行.

  • 请注意,基本构造函数和析构函数中不存在此行为.它将调用基础实现.讨论:http://www.cplusplus.com/forum/general/109477/ (14认同)