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

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • oyljerry 2018-06-02 13:59

    const会影响函数重载,也会影响虚函数覆盖,去掉就不能多态,会调用基类的方法

    评论
    解决 无用
    打赏 举报
  • cfcoolya 2018-06-02 17:03

    如果不加上const,那么C++首先在基类找 display,发现是virtual的,于是在派生类中找和它一致的,结果没有找到重写基类display的函数,所以调用的是基类的。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题