設計模式:多重派遣,設計模式派遣

來源:互聯網
上載者:User

設計模式:多重派遣,設計模式派遣

在物件導向程式設計中,非常常用的手法就是用基類的指標指向衍生類別,然後在執行期通過虛函數機制找到衍生類別中的函數,假設這樣一種情況,全域函數有兩個輸入參數,分別是兩個基類指標 A* ap 和 B* bp,那麼如何既找到ap指向的準確對象,又找到bp指向的準確對象呢?答案就是多重派遣,既先找到ap(bp)指向的準確對象,再去尋找bp(ap)指向的準確對象,程式碼範例如下:

#include <iostream>using namespace std;class A {public:virtual void funca() { cout<<"Base A"<<endl; }};class A1 : public A {public:void funca() { cout<<"Derived A1"<<endl; }};class A2 : public A {public:void funca() { cout<<"Derived A2"<<endl; }};class B {public:virtual void funcb(A *p) { cout<<"Base B"<<endl; p->funca();}};class B1 : public B {public: void funcb(A *p) { cout<<"Derived B1"<<endl; p->funca();}};class B2 : public B {public:void funcb(A *p) { cout<<"Derived B2"<<endl; p->funca();}};void func(A *a, B* b) { b->funcb(a); }int main(){B *bp = new B1();A *ap = new A1();func(ap,bp);return 0;}

在上面的例子中,func(A*, B*)就是前面所說的全域函數,最後通過兩層虛函數調用將ap和bp指向正確的衍生類別對象。當然,實現多重派遣不只這一種方法,也可以通過重載的方式來實現,如下:

class B {public:void funcb(A *p) { cout<<"Base B"<<endl; cout<<"Base A"<<endl;;}void funcb(A1 *p) { cout<<"Base B"<<endl; cout<<"Derived A1"<<endl;}void funcb(A2 *p) { cout<<"Base B"<<endl; cout<<"Derived A2"<<endl;}};
在這種情況下,B需要知道A有哪些衍生類別,然後為A的每一個衍生類別定義一個函數的重載版本,在A中可以通過將this指標傳遞給對B的調用,如下:

class A {public:virtual void funca(B *p) { p->funcb(this);}};class A1 : public A {public:void funca(B *p) { p->funcb(this); }};class A2 : public A {public:void funca(B *p) { p->funcb(this);}};
全域函數的定義如下:

void func(A *ap, B* bp) { ap->funca(bp); }
這樣首先通過虛函數調用找到了A的衍生類別對象,然後在A的衍生類別對象中將this指標傳給對B的調用,而此時傳進去的this指標已經是衍生類別的指標,所以可以協助B選擇正確的函數重載版本。





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.