请问为什么去掉标记出来的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;
}
看下面的代码
#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的函数,所以调用的是基类的。
const会影响函数重载,也会影响虚函数覆盖,去掉就不能多态,会调用基类的方法
如果不加上const,那么C++首先在基类找 display,发现是virtual的,于是在派生类中找和它一致的,结果没有找到重写基类display的函数,所以调用的是基类的。