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 }
  • 相关阅读:
    verilog 数组参数
    跨时钟域设计【一】——Slow to fast clock domain
    跨时钟域设计【二】——Fast to slow clock domain
    跨时钟域设计【三】—— 数据同步
    Vivado学习笔记_002
    使用modelsim仿真DDR3时编译出错的解决方法
    Modelsim仿真tcl脚本与wave.do文件
    %s 与 %0s在 verilog中的区别
    BFM1
    verilog 常用系统函数及例子
  • 原文地址:https://www.cnblogs.com/awen/p/1145873.html
Copyright © 2011-2022 走看看