之前查詢資料時發現使用std::bind可以很好的實現設計模式之中的觀察者模式.
但所調用bind綁定的函數比較難實現繼承.使用多級指針實現繼承.
示例代碼如下:
編譯環境:VS2017
1 #include "pch.h" 2 #include <iostream> 3 #include <vector> 4 #include <functional> 5 class Base 6 { 7 public: 8 virtual void printMsg() { std::cout << "Base Class" << std::endl; } 9 }; 10 11 class Derive :public Base 12 { 13 public: 14 virtual void printMsg() { std::cout << "Derive Class" << std::endl; } 15 }; 16 17 class TestClass 18 { 19 public: 20 void PrintMsg(Base **ppbase) { (*ppbase)->printMsg(); } 21 }; 22 23 int main() 24 { 25 std::vector<std::function<void(Base**)>>vec1; 26 TestClass *ptest = new TestClass(); 27 Base* pbase = new Base(); 28 Base* pder = new Derive(); 29 Base** ppbase = &pbase;//增加子類 30 vec1.push_back(std::bind(&TestClass::PrintMsg, ptest, ppbase)); 31 *ppbase = pder;//賦值 32 vec1[0](NULL); 33 34 return 0; 35 }
如果刪除第29和31行,顯示Base Class,加上的話,顯示Derive Class。這是因為在調用的時候,地址上的指針已經發生了變化.