![](/img/trans.png)
[英]c++ override virtual function with const parameter instead of non-const parameter
[英]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.