繁体   English   中英

虚函数 const 与虚函数非常量

[英]virtual function const vs virtual function non-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() 应该正确调用派生版本,即使 Base func() 是 const 对吗?

 virtual void func() const  //in Base
 virtual void func()        //in Derived

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

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

virtual void func()实际上与virtual void func() const具有不同的签名。 因此,您没有覆盖原始的只读基本函数。 您最终在 Derived 中创建了一个新的虚函数。

如果您曾经尝试创建指向成员函数 (PTMF) 的指针,您也可以了解更多相关信息,但这是一种罕见的必要性(然而,这可能对学习或练习有益)。

C++11 中的 override 关键字对于帮助避免此类错误特别方便。 然后编译器会告诉您,您在派生中对 'func' 的定义不会覆盖任何内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM