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
的覆盖。