【问题标题】:C++ Polymorphism: Does a virtual function in derived class needs to be declared constant if its declared constant in base classC ++多态性:如果派生类中的虚函数在基类中声明为常量,是否需要将其声明为常量
【发布时间】:2018-12-12 07:26:03
【问题描述】:

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

【问题讨论】:

  • 对标题中的问题的简短回答是“是”。

标签: c++ class polymorphism


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多