虚函数 const 与虚函数非常量

新手上路,请多包涵
class Base
{
   public:
   virtual void func() const
   {
     cout<<"This is constant base "<<endl;
   }
};

class Derived : public Base
{
   public:
   virtual void func()
   {
     cout<<"This is non constant derived "<<endl;
   }
};

int main()
{
  Base *d = new Derived();
  d->func();
  delete d;

  return 0;
}

为什么输出打印“这是恒定基数”。但是,如果我在 func() 的基本版本中删除 const,它会打印“这是非常数派生的”

d->func() 应该正确调用 Derived 版本,即使 Base func() 是 const 对吗?

原文由 vamsi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 753
2 个回答
 virtual void func() const  //in Base
 virtual void func()        //in Derived

const 部分 _实际上是函数签名的一部分_,这意味着派生类定义了一个 函数而不是 覆盖 基类函数。这是因为他们的签名不匹配。

当您删除 const 部分时,它们的签名匹配,然后编译器将 func 的派生类定义视为基类函数 func覆盖版本 因此,如果对象的运行时类型是 Derived 类型,则调用派生类函数。这种行为称为运行时多态性。

原文由 Nawaz 发布,翻译遵循 CC BY-SA 3.0 许可协议

不,因为 virtual void func() 不是 virtual void func() const 的覆盖。

原文由 Oliver Charlesworth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏