none
限制类或函数被派生 RRS feed

  • 常规讨论

  • 在系统开发过程中,我们需要通过对程序进行特殊的限制来表达那些是接口,那些是内部的实现。而C++不像Java或C#。拥有public class或者interface的keyword。

    在这里介绍在C++中如何限制类或函数被派生。首先我们看几个例子。

    class InterClass{
    };
    class B :public InterClass
    {
    };

    在这里InterClass只是一个内部的实现,模块的开发人员可能在下一个版本中由于需要将这个类重构,或完全删除这个类。这个时候派生于这个类的类B,在拿到新的版本后,就会有很大的代码变化,同时需要进行大量的测试。

    class A{ public: virtual void Interfunc(); } class B: public A{ public: virtual void Interfunc(); }


    class A{
    public:
        void Interfunc(); //remove virtual
    }
    class B: public A{
    public:
        virtual void Interfunc();
    }

    上面这个例子是A定义了虚函数virtual void Interfunc();。但这个虚函数在重构之后取消了虚函数的特性。那么派生类B可能还认为是虚函数。导致bug产生。

    首先,那么我们看怎么在C++禁止一个类被派生。首先在VC11中使用了final的keyword。用来修饰class。使用这个keyword可以保证该类不被派生。

    但是目前我们还没有这个keyword。我做了一个简单的代码可以帮助实现这个功能

    class FinalSupportClass { protected: FinalSupportClass() { } }; #define FINALCLASS : virtual private FinalSupportClass


    不惜


    麻烦把正确答案设为解答。

    2012年2月10日 2:54
    版主

全部回复

  • 不想被派生的类可以使用这个宏

    class FinalClass FINALCLASS // the class which is final class use this marco
    {
    
    };
    class A:  public FinalClass
    {
    
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
         A a; // an error reported when compile
         return 0;
    }


    麻烦把正确答案设为解答。

    2012年2月10日 3:00
    版主
  • 对于虚函数的限制在VC10中可以使用sealed这个keyword

    class A
            {
            public:
                virtual void func() sealed{} ;
            };
            class B:public A
            {
            public:
                virtual void func(){} ; // an error reported when compile
            };

    另外派生类在派生虚函数的时候可以使用override。这样当基类取消了虚函数后,就会在编译阶段出现错误。

    麻烦把正确答案设为解答。

    2012年2月10日 3:03
    版主
  • 受教了!


    Please mark this reply as answer if it helps you! Thanks for your cooperation! Good Luck to you.

    2012年2月13日 1:49