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() 应该正确调用 Derived 版本,即使 Base func() 是 const 对吗?
原文由 vamsi 发布,翻译遵循 CC BY-SA 4.0 许可协议
const
部分 _实际上是函数签名的一部分_,这意味着派生类定义了一个 新 函数而不是 覆盖 基类函数。这是因为他们的签名不匹配。当您删除
const
部分时,它们的签名匹配,然后编译器将func
的派生类定义视为基类函数func
的 覆盖版本 因此,如果对象的运行时类型是Derived
类型,则调用派生类函数。这种行为称为运行时多态性。