重载关系:
一组函数要重载,必须处于同一作用域下。而且函数名字相同参数列表不同。
class Base
{
public:
Base(int data = 10):ma(data){}
void show(){cout << "Base::show()" << endl;}
void show(int){cout << "Base::show(int)" << endl;}
private:
int ma;
};
class Derive:public Base
{
public:
Derive(int data = 20):Base(data),mb(data){}
//void show(){cout << "Derive::show()" << endl;}....(1)
//void show(int){cout << "Derive::show(int)" << endl;}....(2) //屏蔽之后再进行调用void show(int)就会出错,因为重载函数要在同一个作用域下
private:
int mb;
};
int main()
{
Derive a;
a.show();
a.show(10);
return 0;
}
1.只在基类中定义show(),那么对象调用方法会调用基类中的函数以及重载函数,因为派生类会继承基类的成员方法。
2.在基类中定义show以及重载,在派生类中只定义代码中的(1),那么对象调用方法会首先调用派生类中的方法,并且在同一作用域中寻找是否有符合void show(int)的重载函数,显然不存在。此时不能调用基类中的void show(int),因为作用域不相同。
3.同时加上(1)和(2),那么最后的输出是:Derive::show()
Derive::show(int)
显然首先调用的是派生类中的方法。
隐藏(作用域的隐藏)关系:
在继承结构中,派生类的同名成员ba把基类的同名成员给隐藏调用了。