c++ - C ++多态性:如果派生类中的虚函数在基类中声明为常量,是否需要将其声明为常量
问题描述
我有两节课。在基类 A 中,虚函数window(void)
被声明为常量const
,而在派生类 B 中,虚函数window(void)
未声明为cont
. 这是否满足多态性?如果我调用window()
main,它会先调用派生类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
性。所以是的,如果基方法被声明为const
,覆盖方法也必须被声明const
。
如果您使用的是 C++11 或更高版本,则应使用说明override
符标记覆盖方法,然后编译器将验证它实际上是否覆盖了匹配签名的虚拟基方法,如果匹配的基方法为未找到。如果省略说明符,则不会在编译时获得该验证override
。
推荐阅读
- android - 更新 recylerview 中的单个项目。我正在使用分页库并想更新单个项目/行
- esp32 - arduino for esp32 中的不同 WiFi 模式
- struct - 是否可以将多个映射映射到 Solidity 中的同一个结构?
- java - 我必须在 Java 中手动实现垃圾收集吗?
- yii2 - Yii2读写分离在主从配置中无法连接从服务器
- javascript - 未捕获的 ReferenceError:未定义 sha1
- react-router-dom - 在 react-admin 中将 noLayout 道具添加到自定义路由列表时收到警告
- javascript - toLocaleString() 在 Pug 视图中无法正常工作
- visual-studio - IIS7 服务器应用程序池遇到致命错误
- javascript - 获取具有键值的对象中的特定键深度