首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚函数常量与虚函数非常量

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

Stack Overflow用户
提问于 2012-02-29 03:11:12
回答 3查看 34.5K关注 0票数 17
代码语言:javascript
复制
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;
}

为什么输出会打印"This is constant base“。但是,如果我在func()的基本版本中删除const,它会输出"This is non constant derived“

d->func()应该正确调用派生版本,即使Base func()是常量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-29 03:13:57

代码语言:javascript
复制
 virtual void func() const  //in Base
 virtual void func()        //in Derived

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

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

票数 37
EN

Stack Overflow用户

发布于 2012-02-29 03:14:58

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

如果您曾经尝试创建指向成员函数(PTMF)的指针,您还可以了解更多关于这方面的信息,但这是一种罕见的需要(不过,这可能对学习或实践很有帮助)。

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

票数 5
EN

Stack Overflow用户

发布于 2012-02-29 03:13:11

不是,因为virtual void func()不是virtual void func() const的重写。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9488168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档