请问为什么去掉标记出来的const之后输出就成了0 而不是0,2 谢谢
#include
using namespace std;
class Base{
protected:
int x;
public:
Base(int b=0): x(b) { }
virtual void display() const {cout << x << endl;}
};
class Derived: public Base{
int y;
public:
Derived(int d=0): y(d) { }
void display() _ const_ {cout << x << "," << y << endl;}
};
int main()
{
Derived d(2);
Base *p = &d;
p->display();
return 0;
}
C++ Upcasting 基类指针指向派生类
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- threenewbee 2018-06-02 16:17关注
看下面的代码
#include<iostream> using namespace std; class Base{ protected: int x; public: Base(int b=0): x(b) { } virtual void display() const {cout << x << endl;} }; class Derived: public Base{ int y; public: Derived(int d=0): y(d) { } void display() const {cout << x << "," << y << endl;} void display() {cout << x << "," << y << endl;} //加上这个 }; int main() { Derived d(2); Base *p = &d; p->display(); return 0; }
居然还可以编译
这说明,加不加const,可以构成2个重载的函数
也就是说,c++编译器认为它们不是一回事。
我们知道,函数的重写(派生类覆盖基类的函数),必须派生类函数的参数和基类一样。但是显然这里C++不认为是一样的。
如果不加上const,那么C++首先在基类找 display,发现是virtual的,于是在派生类中找和它一致的,结果没有找到重写基类display的函数,所以调用的是基类的。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 内存地址视频流转RTMP
- ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
- ¥15 找一个QT页面+目标识别(行人检测)的开源项目
- ¥15 有没有整苹果智能分拣线上图像数据
- ¥20 有没有人会这个东西的
- ¥15 cfx考虑调整“enforce system memory limit”参数的设置
- ¥30 航迹分离,航迹增强,误差分析
- ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
- ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
- ¥15 LLM accuracy检测