網站首頁 編程語言 正文
重載關系
一組函數要重載,必須處在同一個作用域中 ,而且函數名字相同,參數列表不同
代碼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的內存塊 ,危險訪問
代碼4
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout<<"Base()"<<endl;
}
void show(){
cout<<"Base show()"<<endl;
}
void show(int x){
cout<<"Base show(int x)"<<endl;
}
~Base(){
cout<<"~Base()"<<endl;
}
private:
int ma;
};
class Derive :public Base{
public:
Derive(){
cout<<"Derive()"<<endl;
}
void show(){
cout<<"Derive show()"<<endl;
}
~Derive(){
cout<<"~Derive()"<<endl;
}
private:
int ma;
};
int main(){
Derive d;
Derive *pd=&d;
d.show();
d.show(100); //編譯報錯, Derive 的void show()方法把Base 的void show() void show(int x) 都隱藏了
pd->show(100);//編譯報錯 Derive 的void show()方法把Base 的void show() void show(int x) 都隱藏了
return 0;
}
代碼5
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout<<"Base()"<<endl;
}
virtual void show(){
cout<<"Base show()"<<endl;
}
void show(int x){
cout<<"Base show(int x)"<<endl;
}
~Base(){
cout<<"~Base()"<<endl;
}
private:
int ma;
};
class Derive :public Base{
public:
Derive(){
cout<<"Derive()"<<endl;
}
virtual void show(){
cout<<"Derive show()"<<endl;
}
~Derive(){
cout<<"~Derive()"<<endl;
}
private:
int ma;
};
int main(){
Derive *pd=new Derive();
pd->show(100); //編譯報錯,Derive 中的show() 函數,只要名字與Base中有相同名字的函數的,就會隱藏掉Base中所有的show方法(不管加不加virtual),包括void show() void show(int x)
return 0;
}
原文鏈接:https://www.cnblogs.com/erichome/p/16929064.html
相關推薦
- 2022-05-25 @NoArgsConstructor、@AllArgsConstructor、@RequiredAr
- 2023-02-06 詳解Golang中select的使用與源碼分析_Golang
- 2022-06-08 Python使用PyYAML庫讀寫yaml文件的方法_python
- 2022-12-05 Python中WebService客戶端接口調用及身份驗證的問題_python
- 2022-12-08 利用C語言編寫一個無限循環語句_C 語言
- 2022-09-23 Android?如何獲取傳感器的數據方法詳解_Android
- 2022-02-15 eclipse配置Tomcat和Tomcat出現無效端口解決辦法_Tomcat
- 2022-06-16 Python基礎之函數與控制語句_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支