1. 程式人生 > >C++之 模板化基類 的名稱處理

C++之 模板化基類 的名稱處理

class CompanyA
{
    public:
        void sendClearMsg() { cout << "call company A sendClear " << endl;}
        void sendEncryptedMsg() { cout << "call company A sendEncryptedMsg " << endl;}

};

class CompanyB
{
    public:
        void sendClearMsg() { cout << "call company B sendClear " << endl;}
        void sendEncryptedMsg() { cout << "call company B sendEncryptedMsg " << endl;}

};

//首先定義了兩個類,用於表示各個公司自己傳送資訊的方式。

//CompanyC與上述兩個公司不一樣,只允許將資料加密之後再傳送

//companyC only send encrypted Msg
class CompanyC
{
    public:
        void sendEncryptedMsg() { cout << "call company C sendEncryptedMsg " << endl;}

};


//定義了一個傳送資訊的類,對於不同的公司,封裝了公司的傳送資訊的方式,取決於模板實參。

template
class MsgSender
{
    public:
        void sendClear()
        {
            cout << "call MsgSender sendClear ... " << endl;
            Company c;
            c.sendClearMsg();
        }
        void sendEncrypted()
        {
            cout << "call MsgSender sendEncrypted ... " << endl;
            Company c;
            c.sendEncryptedMsg();
        }
};


//針對CompanyC的特化版本的傳送資訊方式,即如果模板實參為CompanyC,那麼直接呼叫此模板類
template<>
class MsgSender
{
    public:
        void sendClear()
        {
            cout << "call MsgSender sendClear ... " << endl;
        }
        void sendEncrypted()
        {
            cout << "call MsgSender sendEncrypted ... " << endl;
        }
};

//在每次將資訊發出去時,記錄下發出的資訊。
//log the Message
template
class LogSendMsg : public MsgSender
{
public:
    void Log()
    {
        cout << "call LogSendMsg log ..." << endl;
    //    sendClear(); //錯誤!!因為LogSendMsg類不知道這個sendClear函式是什麼?甚至不知道是哪兒來的。
        //error: there are no arguments to 'sendClear' that depend on a template parameter, so a declaration of 'sendClear' must be available|
        cout << "call LogSendMsg log end... " << endl;

    }

};

相關推薦

C++ 模板名稱處理

class CompanyA { public: void sendClearMsg() { cout << "call company A sendClear " << endl;} void sendEncryptedMsg() { cout

c++訪問從繼承的成員

1當派生類與基類中有相同成員時:若沒有特別限定,則通過派生類物件使用的是派生類的同名成員。如果要通過派生類物件訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符“::”來限定#include <iostream> using namespace std; cl

C#中要自己手動在派生的建構函式中逐一的初始的欄位嗎

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[

C++學習模板篇(模板

1.為什麼要有類模板? 是因為在很多使用場合下,一個類會被使用很多次,用的時候呢也發現很多重複的地方,只有它的資料型別不同,這個時候就要用到類模板。 2.單引數類模板形式 (1)宣告形式 單引數類模板形式如下,可見與函式模板比較,宣告模板的方式相同,都是使用template

C++模板函式與模板

C++中的模板是為了適應不同資料型別的呼叫。關鍵詞有template class typename template <typename T>T  max(T a, T b){  return (a>b) ? a:b;}class和typename在模板中意

C++模板(Template) 容器map 及 物件副本 深/淺拷貝 等問題

例如:假若你沒有提供CFileAttribute::operator=(過載賦值操作符),那麼語句fileAttribute1 = fileAttribute2就相當於:memcpy(&fileAttribute1, &fileAttribute2, sizeof(CFileAttribut

Spring MVC-處理程序映射(Handler Mapping)-控制器名稱處理程序映射(Controller Class Name Handler Mapping)示例(轉載實踐)

back app ppi lsp class obj ner schema over 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_controllerclassnamehandlermapping.h

Spring MVC筆記(八) 控制器名稱處理映射

return https bst protect urn location utf-8 r.java 訪問 ControllerClassNameHandlerMapping類是基於約定的處理程序映射類,它將URL請求映射到配置中提到的控制器的名稱。這個類接受控制器名稱並將

C基本數據型(一)

C 數據類型 我們今天來開始學習 C 語言了,那麽 C 語言是最基礎的語言,學好 C 語言有助於我們以後更好的學習其他語言。那麽今天我們就來了解下 C 語言中的數據類型。 那麽什麽是數據類型呢?我們可以這樣來理解:數據類型可以理解為固定內存大小的別名,它是創建變量的模子。

C++ 模板Template的使用

attribute att 可能 類模板 title 尖括號 exp gin container 轉自https://www.cnblogs.com/cynchanpin/p/7127897.html 1、在c++Template中非常多地方都用到了typename與cl

c#實例繼承,必須對被繼承的程序集做引用

類的屬性 結構 編譯環境 gin 是否 image 實例化 bsp class 0x00 問題 類型“Model.NewModel”在未被引用的程序集中定義。必須添加對程序集“Model, Version=1.0.0.0, Cultur

Java 初始

class Art{ Art(){System.out.println("Art constructor");} } class Drawing extends Art{ Drawing(){System.out.println("Drawing constructor");} } public

C++模板超程式設計

關於模板原程式設計知識強烈推薦:http://blog.jobbole.com/83461/,非常好! 這篇文章通過舉例詳細介紹了模板的模板引數,模板特例化,模板例項化以及編譯連結等模板基礎知識。 本文主要分析文章中的模板超程式設計例子: 首先複述一下模板超程式設計,以下標紅或者

C++結構體與

C++中的結構體與類 對比C語言中的結構體 建構函式與解構函式 為什麼需要建構函式 建構函式的特點 建構函式的過載 解構函式 結構體與類的區別 總結 對比C語言中的結構體 在C語言中

C#面向物件和的關係及的構造方法

一、前言 既然看到面向物件了,那麼什麼是面向物件,而在講到面向物件的時候還有類,而且物件和類是不可分離的,相輔相成的,在看完小楊老師講的課之後根據自己的理解和筆記總結出以下部落格。 二、物件和類的定義 1.萬物皆物件,物件由靜態屬性和動態行為組成。 在我們的生活中有很多物件,但是

C++模板

模板的引入 在討論模板之前,先看一下這個經典的交換程式: #include <iostream> using namespace std; void swap1(int& a, int& b) { int temp = a; a

C#關於介面到到子繼承到方法實現的示例

  介面(interface)–>基類–>子類繼承–>方法實現;程式碼如下: class Program { static void Main(string[] args) {

C++模板詳解(一)

C++模板   模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。   模板是一種對型別進行引數化的工具;   通常有兩種形式:函式模板和類模板;   函式模板針對僅引數型別不同的函式;   類模板針對僅資料成

派生不能在成員初始列表中直接初始的成員

初始化基類成員 建構函式是不可繼承的。因此,派生類的建構函式必須通過呼叫基類的建構函式初始化基類成員,不能夠在派生類初始化列表直接初始化基類的成員,“越級初始化”。派生類的建構函式的一般格式為: 派生類名(形參表):基類名1(形參表1),基類名2(形參表2)··· {···} 注意事項: (1)在建立派生類

c#單例模式

在unity3d中:using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class MonoSingleton<T> : M