template學習:實現一個類似多態的效果,來自WTL的一個技巧

來源:互聯網
上載者:User
    多態都是在運行時實現的,C++中通過VPTR和VTABLE來提供運行時的動態調用;但是,VPTR和VTABLE的使用影響了效能。WTL中的一個技巧實現了類似多態的功能,並且不會影響效能。#include <stdio.h>

template <typename SubClass>
class Base
...{
public:
    void Run()
    ...{
        SubClass* t = (SubClass*)this;
        t->Func();
    }
    void Func()
    ...{
        printf("Base::Run() ");
    }
};

class Child : public Base<Child>  //子類將自己的類型傳遞給父類
...{
public:
    void Func()  //子類實現了父類的同名方法
    ...{
        printf("Child::Run() ");
    }
};

class Child1 : public Base<Child1>
...{
public:

};

int main()
...{
    Child a;
    Child1 b;
    a.Run();  //調用子類的方法
    b.Run();  //調用父類的方法
    return 1;
}

    感覺上這個技巧可能出現問題,因為Base類和Class類的記憶體布局不一定是上半部分完全相同的。特別是Base類存在虛函數,或者Base類存在虛繼承的情況下Child* obj=(Child*)this;這裡可能產生錯誤。
   因為這個技巧是來自WTL的,而WTL又依賴於VC編譯器,所以這個技巧應該能夠保證使用VC的編譯器正常,但是其他編譯器就不一定了。

   SO,SO,我宣傳了這個技巧,但我不建議使用它。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.