我有两节课。在基类A中,虚函数window(void)声明为常量const,而在派生类B中,window(void)不声明为cont。这满足多态性吗?如果我在主目录中调用window(),它将首先调用派生类B window(),然后是A类版本的window()。就我而言,它不是这样。我是否也必须将const放在派生函数的末尾?

  class A
  {
   public:
      virtual int window (void) const
      {
         std::cout<<" We are in class A "<<std::endl;
         return std::min(x,y); // x is smaller
      }
    private:
    int x, y;
   }

  class B : public A
  {
   public:
       virtual int window (void)
       {
          std::cout<<" We are in class B "<<std::endl;
          return A::window ();
       }
   }

   void main()
   {
     int z = window();
     std::cout<<z<<std::endl;
   }


输出应该是这样的

 We are in class B
 We are in class A
 x

最佳答案

覆盖方法的签名必须与要覆盖的虚拟基本方法的签名完全匹配(很好,除了协变返回值的情况外,但这与您的问题无关)。该签名包括结尾的const ness。所以是的,如果基本方法声明为const,则覆盖方法也必须声明为const

如果使用的是C ++ 11或更高版本,则应使用override specifier标记覆盖方法,然后编译器将验证它实际上是覆盖匹配签名的虚拟基方法,并且如果匹配基找不到方法。如果省略override说明符,则不会在编译时获得该验证。

07-26 05:21