Phantom03038 2018-06-02 12:29 采纳率: 100%
浏览 802
已采纳

C++ Upcasting 基类指针指向派生类

请问为什么去掉标记出来的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;
}

  • 写回答

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的函数,所以调用的是基类的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥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检测