首页 > 解决方案 > C ++多态性:如果派生类中的虚函数在基类中声明为常量,是否需要将其声明为常量

问题描述

我有两节课。在基类 A 中,虚函数window(void)被声明为常量const,而在派生类 B 中,虚函数window(void)未声明为cont. 这是否满足多态性?如果我调用window()main,它会先调用派生类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

标签: c++classpolymorphism

解决方案


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

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


推荐阅读