zoukankan      html  css  js  c++  java
  • 《轉貼》以Virtual Inheritance及Template讓C++能實現C#中的sealed

    來源:http://www.host01.com/article/software/cc/20060917232906391.htm
    作者:CUJ

    今天看到《軟體研發5》有一篇譯自CUJ的文章使類不可繼承,方法很好,但有幾個毛病:

    1.  
    正如譯者說的,還是有辦法進行繼承,雖然方法有點變態
    2.  
    最主要的毛病卻是,這種辦法會造成運行時的開銷。因為至少會增加VTABLE指針。

    所以,針對以上兩個問題,作了改動,如下:

     1 #ifdef _DEBUG
     2 

     3 namespace internalSealed
     4 
    {
     5     template<typename T>

     6     class Class_Is_Sealed
     7 
        {
     8     protected
    :
     9 
            Class_Is_Sealed(){};
    10 
        };
    11 
    }
    12 

    13 template<typename T>
    14 class Sealed: private virtual internalSealed::Class_Is_Sealed<T>
    15 {
    16 
        friend typename T;
    17 
    };
    18 

    19 #else
    20 
    21 template<typename T>
    22 class Sealed
    23 
    {
    24 
    };
    25 

    26 #endif 


    這樣子,在
    Debug方式下,只要一個類從Sealed<T>繼承,就不可再被繼承了。
    同時,在Release方式下,因為不再檢查是否可以被繼承,因而不產生開銷(空類會被編譯器優化掉)。

    使用例子:

     1 #include "Sealed.h"
     2 
     3 class test: Sealed<test>
     4 {
     5 public
    :
     6     int
     print()
     7 
        {
     8         return 1
    ;
     9 
        }
    10 
    };
    11 

    12 class ttt: public test //, Sealed<test>, Sealed<ttt>
    13 {
    14 public
    :
    15     int
     print()
    16 
        {
    17         return 2
    ;
    18 
        }
    19 
    };
    20 

    21 int main(int argc, char* argv[])
    22 
    {
    23 
        test t;
    24     printf("%d\n"
    , t.print());
    25 

    26     ttt t1;
    27     printf("%d\n"
    , t1.print());
    28     return 0
    ;
    29 }
  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/awen/p/1145873.html
Copyright © 2011-2022 走看看