具有虚拟功能的C ++多级继承

Pla*_*ove 1 c++ c++17

我对C ++中的多级继承和虚函数有些困惑。在下面的示例中,我具有3个Bottom继承级别,分别是从Middle继承自Top

如果我在Topas中声明该函数virtual并使用type指针Middle,则Middle即使未声明该函数,它仍然会覆盖声明的函数virtual

我期待:

Middle* ptr = new Bottom();
ptr->hello(); // Expectation: "Hello Middle"  (Actual: "Hello Bottom")
Run Code Online (Sandbox Code Playgroud)

Top* ptr = new Bottom();
ptr->hello(); // "Hello Bottom"
Run Code Online (Sandbox Code Playgroud)

但这似乎并非如此。为什么是这样?

完整代码:

#include <iostream>

//  Top
//   ^
// Middle
//   ^
// Bottom

struct Top {
  // This is set to virtual.
  virtual void hello() { std::cout << "Hello Top\n"; }
};

struct Middle : public Top {
  // But not this.
  void hello() { std::cout << "Hello Middle\n"; }
};

struct Bottom : public Middle {
  // So why is this called if the type is Middle?
  void hello() { std::cout << "Hello Bottom\n"; }
};

int main() {
  Middle *ptr = new Bottom(); // Will use hello() in Bottom.
  // Top *ptr = new Bottom(); // Same result as the above.
  ptr->hello();
  delete ptr;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Obl*_*ica 5

如果基本函数是虚拟的,则无论您是否将它们指定为虚拟,派生函数都是虚拟的:

如果某个成员函数vf在Base类中声明为虚函数,而某些Derived类(直接或间接地从Base派生)对成员函数声明了相同的

名称参数类型列表(而不是返回类型)cv-qualifiers ref-qualifiers然后,Derived类中的此函数也是虚拟的 (无论是否在其声明中使用了关键字virtual)并覆盖Base :: vf(是否声明中使用了override一词)。


如果要访问基本功能,可以使用:

ptr->Top::hello();

Middle* ptr2 = new Bottom();
ptr2->Middle::hello();

delete ptr;
delete ptr2;
Run Code Online (Sandbox Code Playgroud)

活在当下