我有两节课。在基类A中,虚函数window(void)
声明为常量const
,而在派生类B中,window(void)
不声明为cont
。这满足多态性吗?如果我在主目录中调用window()
,它将首先调用派生类B window()
,然后是A类版本的window()
。就我而言,它不是这样。我是否也必须将const放在派生函数的末尾?
class A
{
public:
virtual int window (void) const
{
std::cout<<" We are in class A "<<std::endl;
return std::min(x,y); // x is smaller
}
private:
int x, y;
}
class B : public A
{
public:
virtual int window (void)
{
std::cout<<" We are in class B "<<std::endl;
return A::window ();
}
}
void main()
{
int z = window();
std::cout<<z<<std::endl;
}
输出应该是这样的
We are in class B
We are in class A
x
最佳答案
覆盖方法的签名必须与要覆盖的虚拟基本方法的签名完全匹配(很好,除了协变返回值的情况外,但这与您的问题无关)。该签名包括结尾的const
ness。所以是的,如果基本方法声明为const
,则覆盖方法也必须声明为const
。
如果使用的是C ++ 11或更高版本,则应使用override
specifier标记覆盖方法,然后编译器将验证它实际上是覆盖匹配签名的虚拟基方法,并且如果匹配基找不到方法。如果省略override
说明符,则不会在编译时获得该验证。