例子一:
class A
{
public:
A(int m);
int setValue(int mval);
void setValue();
private:
int m_data;
}
分析:该类中, 函数setValue(int mval) 和 函数setValue()为重载成员函数。因为,函数名相同,参数不同,在同一个类作用域中,两函数构成重载成员函数。注意:重载函数必须在相同的作用域中。
总结:
重载函数几个 条件:
1. 相同作用域
2. 同函数名
3. 参数不同(类型、个数、顺序)
4. 有没有virtual均可
例子二:
class A
{
public:
A(int m);
virtual int setValue(int mval);
private:
int m_data;
}
class B : public A
{
public:
B(int a, float b,int c);
virtual int setValue(int nval);
private:
float m_value;
int m_cal;
}
分析:派生类B中 setValue函数 覆盖了 基类A中setValue函数。因为两个类中函数名相同,参数相同,基类成员函数为虚函数。
总结:
构成覆盖的几个条件:
1. 不同作用域(基类和派生类)
2. 同函数名
3. 相同函数参数
4.基类成员函数为虚函数。
例子三:
class A
{
public:
A(int m);
virtual int setValue(int mval);
private:
int m_data;
}
class B : public A
{
public:
B(int a, float b,int c);
virtual int setValue(float nval);
private:
float m_value;
int m_cal;
}
分析: 派生类B中setValue函数 隐藏了 基类A中setValue函数。因为两类中,函数名相同,函数参数不同,虽然都有virtual,但仍为隐藏,注意与覆盖相区别。
例子四:
class A
{
public:
A(int m);
int setValue(int mval);
private:
int m_data;
}
class B : public A
{
public:
B(int a, float b,int c);
int setValue(float nval);
private:
float m_value;
int m_cal;
}
分析: 派生类B中setValue函数 隐藏了 基类A中setValue函数。因为两类中,函数名相同,函数参数不同,虽然都没有virtual,但仍为隐藏,注意与重载相区别。
例子五:
class A
{
public:
A(int m);
int setValue(int mval);
private:
int m_data;
}
class B : public A
{
public:
B(int a, float b,int c);
int setValue(int nval);
private:
float m_value;
int m_cal;
}
分析: 派生类B中setValue函数 隐藏了 基类A中setValue函数。因为两类中,函数名相同,函数参数相同,虽然都没有virtual,但仍为隐藏,注意与覆盖相区别。
综合例子三、四、五
总结:隐藏有以下三种情况:
1. 不同作用域(基类和派生类), 同函数名,同参数,基类没有virtual,为隐藏。(区别于覆盖)
2. 不同作用域(基类和派生类),同函数名,不同参数,基类有virtual,为隐藏。(区别于重载)
3. 不同作用域(基类和派生类),同函数名,不同参数,基类没有virtual,为隐藏。(区别于重载)