程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++:派生類訪問模板化基類(templatized base class)的命名

C++:派生類訪問模板化基類(templatized base class)的命名

編輯:關於C++

派生類繼承模板化基類的成員函數, 默認是無法訪問, 模板化基類的命名.

原因是模板的定制化有可能取消某些函數, 為了能在編譯期檢測出錯誤, 所以默認無法訪問.

派生類訪問模板化基類, 包含三種方法:

1. 調用基類函數時, 使用"this->", 指明調用的類, 是本類, 在編譯時, 可以進行檢查;

2. 使用using聲明式, 可以把基類的函數引入派生類, 在編譯時, 可以進行檢查;

3. 使用顯示修飾(explicit qualification), 不推薦, 顯示修飾會屏蔽virtual的動態綁定;

本例為: 派生類, 調用基類的函數, 重寫修改格式, 進行輸出;

代碼:

/* 
 * test.cpp 
 * 
 *  Created on: 2014.04.18 
 *      Author: Spike 
 */
      
/*eclipse cdt, gcc 4.8.1*/
      
#include <iostream>  
#include <string>  
#include <memory>  
      
using namespace std;  
      
class CompanyCaroline {  
public:  
    void sendCleartext(const std::string& msg) {  
        std::cout << "Cleartext: " << msg << std::endl;  
    }  
    void sendEncrypted(const std::string& msg) {  
        std::cout << "Encrypted: " << msg << std::endl;  
    }  
};  
      
struct MsgInfo {  
    std::string cleartext;  
    std::string encrypted;  
};  
      
template<typename Company>  
class MsgSender {  
public:  
    void sendClear(const MsgInfo& info) {  
        std::string msg = info.cleartext;  
        Company c;  
        c.sendCleartext(msg);  
    }  
    void sendSecret(const MsgInfo& info) {  
        std::string msg = info.encrypted;  
        Company c;  
        c.sendEncrypted(msg);  
    }  
};  
      
template<typename Company>  
class LoggingMsgSender : public MsgSender<Company> {  
public:  
    //using MsgSender<Company>::sendClear; //方法二  
    void sendClearMsg(const MsgInfo& info) {  
        std::cout << "Log Begin : ";  
        //sendClear(info);  
        this->sendClear(info); //方法一  
        //MsgSender<Company>::sendClear(info); //方法三, 會關閉虛綁定的行為, 不建議  
    }  
};  
      
      
int main() {  
    MsgInfo mi = {"Clear", "Encrypted"};  
    LoggingMsgSender<CompanyCaroline> lms;  
    lms.sendClearMsg(mi);  
      
    return 0;  
}

輸出:

Log Begin : Cleartext: Clear

作者:csdn博客 Spike_King

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved