重载关系
一组函数要重载,必须处在同一个作用域zhong ,而且函数名字相同,参数列表不同
代码1中的Base中的 show() 和show(int) 属于重载
代码2中的Base中的 show() 和Derive中的show()不属于重载
隐藏的关系(主要是指作用域隐藏)
在继承结构当中,派生类的同名成员,把基类的同名成员给隐藏掉了
例如代码2中的 Derive中的show() 和Base()中的show() ,show(int) 是隐藏关系
代码1
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
d.show(); //正常调用基类show()
d.show(100); //正常调用基类show(int)
return 0;
}
代码2
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Derive d(20);
d.show(); //调用子类show()
d.show(100);//调用报错 报错信息 "Derive::show()函数不接受1个参数"
// 即 Derive中的 show()方法把Base中的 show 和show(int)都给隐藏掉了
// 所以d.show() 没问题,调用的是派生类的show(),但是d.show(100)报错了,因为
// 父类的show()和show(int)都被隐藏了,而派生类Derive中没有 show(int)方法所以报错了
// 如果想调用父类的show(int) 要这样写 d.Base.show(100);
return 0;
}
基类对象 -> 派生类对象 类型由上向下转 NOT OK
Base b(10);
Derive d(20);
d=b;// NOT OK
派生类对象 ->基类对象 类型由下向上转 OK
Base b(10);
Derive d(20);
b=d;//OK
派生类指针(引用) ->基类指针 类型由下向上转 OK
Base b(10);
Derive d(20);
Base *pb =&d;// OK 如下图, 基类指针只能访问到基类那一部分的成员,所以是安全的
代码3
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base"<<endl;
}
void show(){cout<<"Base Show()"<<endl;}
void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Base b(10);
Derive d(20);
Base *pb =&d;
pb->show(); //调用的是基类的 show
pb->show(100);//调用的是基类的 show(int)
((Derive *)pb)->show(); //强转后 调用的是派生类的 show
}
基类指针(引用) -> 派生类对象 类型由上向下转 NOT OK
Base b(10);
Derive d(20);
Derive *pb =&b;// NOT OK pb指针能够访问的区域超过了实际对象b的内存块 ,危险访问
原文地址:http://www.cnblogs.com/erichome/p/16929064.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性