指標支援隱式轉換(implicit conversion), 在動態綁定中,衍生類別指標可以轉換為基類指標.
但是模板的執行個體化(instantiations)之間, 是單獨存在的,
衍生類別的執行個體化的模板(SmartPtr<Derived>), 不能轉換為基類執行個體化的模板(SmartPtr<Base>);
需要明確的編寫, 因為衍生類別也可以繼續做為基類, 產生衍生類別, 所以無法直接寫出建構函式.
使用成員函數模板(member function template), 再聲明一個模板參數, 提供這種隱式轉換.
為了使用轉換隻能發生在可以轉換的指標, 如"Derived->Base", 不能逆序, 所以引入相關約束判斷是否可以轉換.
在成員初始化列表(member initialization list)中調用get()函數, 判斷是否可以隱式轉換.
使用成員函數模板的建構函式, 是成員函數的一種, 並不是重載複製建構函式, 所以類會自動產生一個預設建構函式.
代碼注意: 第一個可以轉換, 第二個不能轉換, 第三個使用預設的建構函式.
代碼:
/* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> using namespace std; class Base{}; class Derived : public Base {}; template<typename T> class SmartPtr { public: SmartPtr() = default; template<typename U> SmartPtr(const SmartPtr<U>& other) : heldPtr(other.get()) { std::cout << "SmartPtr:CopyConstructor" << std::endl; } T* get() const {return heldPtr;} private: T* heldPtr; }; int main() { SmartPtr<Derived> spd; SmartPtr<Base> spb(spd); //SmartPtr<Base> spb1; //SmartPtr<Derived> spd1(spb1); //無法進行隱藏轉換 SmartPtr<Base> spd2; SmartPtr<Base> spd21(spd2); //使用預設的複製建構函式 return 0; }
輸出:
SmartPtr:CopyConstructor
作者:csdn部落格 Spike_King
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/