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()是常量?
发布于 2012-02-29 03:13:57
virtual void func() const //in Base
virtual void func() //in Derivedconst部件实际上是函数签名的一部分,这意味着派生类定义了一个新函数,而不是覆盖基类函数。这是因为他们的签名不匹配。
当您移除const部件时,它们的签名匹配,然后编译器将func的派生类定义视为基类函数func的重写版本,因此,如果对象的运行时类型为Derived类型,则调用派生类函数。这种行为称为运行时多态性。
发布于 2012-02-29 03:14:58
实际上,virtual void func()与virtual void func() const的签名不同。因此,您没有覆盖原始的只读基函数。您最终创建了一个新的虚函数,而不是在派生函数中。
如果您曾经尝试创建指向成员函数(PTMF)的指针,您还可以了解更多关于这方面的信息,但这是一种罕见的需要(不过,这可能对学习或实践很有帮助)。
C++11中的override关键字特别方便,可以帮助避免此类错误。然后编译器会告诉你,你在派生中对'func‘的定义没有覆盖任何东西。
发布于 2012-02-29 03:13:11
不是,因为virtual void func()不是virtual void func() const的重写。
https://stackoverflow.com/questions/9488168
复制相似问题