首页 文章

C多态性:如果派生类中的虚函数在基类中声明为常量,则它是否需要声明为常量

提问于
浏览
0

我有两节课 . 在基类A中,虚函数 window(void) 被声明为常量 const ,而在派生类B中, window(void) 未声明为 cont . 这是否满足多态性?如果我在main中调用 window() ,它首先会先调用派生类B window() ,然后再调用 window() 的A类版本 . 在我的情况下,它不是这样做的 . 我是否还必须将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

1 回答

  • 4

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

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

相关问题