我有两节课 . 在基类A中,虚函数 window(void)
被声明为常量 const
,而在派生类B中, window(void)
未声明为 cont
. 这是否满足多态性?如果我在main中调用 window()
,它首先会先调用派生类B window()
,然后再调用 window()
的A类版本 . 在我的情况下,它不是这样做的 . 我是否还必须将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
1 回答
重写方法的签名必须与它覆盖的虚拟基本方法的签名完全匹配(除了协变返回值的情况,但这与您的问题无关) . 该签名包括尾随
const
ness . 所以,是的,如果基本方法声明为const
,则重写方法也必须声明为const
.如果您使用的是C 11或更高版本,则应使用override specifier标记重写方法,然后编译器将验证它实际上是否覆盖匹配签名的虚拟基本方法,如果找不到匹配的基本方法,则会生成错误 . 如果省略
override
说明符,则无法在编译时获得该验证 .