虚函数常量与虚函数非常量

  • 本文关键字:常量 函数 非常 c++
  • 更新时间 :
  • 英文 :

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具有不同的签名。因此,您没有覆盖原始的只读基函数。你最终在派生中创建了一个新的虚拟函数。

如果您尝试创建指向成员函数 (PTMF( 的指针,也可以了解更多信息,但这是罕见的必需品(但是,可能对学习或实践有好处(。

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

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

最新更新