網站首頁 編程語言 正文
C++模板類繼承和成員訪問
c++中聲明一個模板類及子類,在子類中如果需要訪問父類的protected變量,需要使用父類的類作用域限定符,否則會報“identifier not found”錯誤。
例如:
template<typename T>
class A
{
protected:
?? ?int a;
};
?
template<typename T>
//模板的繼承,基類需要指定模板參數
class B : public A<T>
{
public:
?? ?void func()
?? ?{
? ? ? ? //此處必須使用A::a來訪問;否則會找不到a的定義
? ? ? ? //如果不是模板類,顯然可以直接使用a來訪問
?? ??? ?cout << A::a << endl;
?? ?}
};
模板函數的內部類繼承時,也是類似的。
例如:
template<typename T>
class outer
{
public:
?? ?class innerBase
?? ?{
?? ?protected:
?? ??? ?T a;
?? ?};
?
? ? //在模板類內部繼承相同范圍內的基類,基類能指定模板參數(內部類默認使用外部類的模板參數)
? ? //如果繼承其他的模板類,則需要指定模板參數;內部類也可以定義自己的模板參數
?? ?class innerDrive : public innerBase
?? ?{
?? ?public:
?? ??? ?void func()
?? ??? ?{
? ? ? ? ? ? //此處必須使用innerBase::a(或者使用outer::innerBase::a)來訪問a
? ? ? ? ? ? //否則無法找到a的定義
?? ??? ??? ?cout << innerBase::a << endl;
?? ??? ?}
?? ?};
};
類、類模板的protected成員(受保護)繼承規則
如下,為基類模板和派生類模板的繼承層次:
//基類模板
template<typename T>
class D0 {
protected:
int testi;
double testdouble;
};
//派生類模板
template<typename T>
class D1 :public D0 {
public:
};
編譯時報錯如下:
原因是派生類只能繼承類,而不能繼承類模板,解決措施就是D0后添加模板類型參數,如下:
//基類模板
template<typename T>
class D0 {
protected:
int testi;
double testdouble;
};
//派生類模板
template<typename T>
class D1 :public D0<T> {//修改處,D0后增加了<T>
public:
};
現在開始在派生類中使用繼承自基類的protected成員:
//基類模板
template<typename T>
class D0 {
protected:
int testi;
double testdouble;
};
//派生類模板
template<typename T>
class D1 :public D0<T> {
public:
D1():testi(0) { }//添加了一行使用繼承自基類的protected成員的語句
};
編譯時報錯如下:
原因在于,派生類只能訪問具體某個類的protected成員,不能訪問一個模板的protected成員。
testi未指定究竟是繼承自哪個類的protected成員,解決措施措施如下:
(1)如果想訪問的是繼承自D0類的testi成員,則修改如下:
//基類模板
template<typename T>
class D0 {
protected:
int testi;
double testdouble;
};
//派生類模板
template<typename T>
class D1 :public D0<T> {
public:
D1():D0<int>::testi(0) { }//訪問繼承自D0<int>的protected成員
};
(2)如果是想訪問跟隨實例化D1的類型T,則修改如下:
//基類模板
template<typename T>
class D0 {
protected:
int testi;
double testdouble;
};
//派生類模板
template<typename T>
class D1 :public D0<T> {
public:
D1():D0<T>::testi(0) { }//如果D1被實例化時為D1<int>,那么就訪問繼承自D0<int>的protected成員
//如果D1被實例化時為D1<doublie>,那么就訪問繼承自D0<double>的protected成員
//如果D1被實例化時為D1<string>,那么就訪問繼承自D0<string>的protected成員
//…………………………………………
};
(2.1)也就是說T會跟隨實例化D1模板的類型而變化。
小結一下:
(1)派生類不能直接使用基類模板的protected成員,必須指定是使用
具體哪個基類的protected成員。
原文鏈接:https://blog.csdn.net/gtl_csdn/article/details/82894339
相關推薦
- 2022-06-28 C語言簡明清晰講解結構體_C 語言
- 2022-12-07 Android?Flutter實現興趣標簽選擇功能_Android
- 2022-10-04 Python基礎之dict和set的使用詳解_python
- 2022-12-03 SQL?Server如何通過SQL語句直接操作另一臺服務器上的SQL?SERVER的數據_MsSql
- 2022-12-04 python中pyplot直方圖的繪制方式_python
- 2022-09-25 Linux基礎組件之基于循環數組的無鎖隊列
- 2022-05-27 redis分布式Jedis類型轉換的異常深入研究_Redis
- 2023-03-13 React中遍歷數組生成標簽問題_React
- 最近更新
-
- 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同步修改后的遠程分支