• C++中设计一个类,使其不能继承


    1.C++11中已经有了final关键字:它的作用是指定类的虚函数不能被该类的继承类覆盖(override),或者是指定一个类成为一个不能被继承的类(final class)

    2.派生类用调用基类的构造函数来初始化基类部分,若将基类构造函数声明为private,则实例化派生类成员时链接出错,但是这样基类也不能实例化,编译出错

    3.将一个类的构造函数声明为private,则该类及其子类都不能实例化,但是若把子类声明为该类的友元,则该子类可以调用基类的private成员函数,也就是说此时子类可以实例化,而且这时候子类的子类也可以初始化,因为子类的子类初始化基类部分是调用子类的构造函数,而子类是可以正常初始化的,所以想到虚继承,子类虚继承自父类,子类的子类正常继承自子类,此时子类和子类的子类共用一个指针,该指针指向基类部分。

    vitural base class 会在mosted derived class 中先被调用,然后在处于中间层的base class中抑制vitural base class的constructor,以保证virtual base class共享一份。如果少了virtual继承则是递归的调用constructor,就不能实现final的功能啦。<=最底层的派生类中会先调用virtual base class中构造函数,而不是递归调用直接基类的构造函数

    class A
    {
    private:
        A(){}
    
        friend class B;
    };
    
    class B : virtual A
    {
    };
    
    class C : public B
    {
    };
    
    void main()
    {
        B b;//ok
        C c;//false
    }

     4.构造和析构任何一个设为私有都可以,然后提供一个或两个公有静态方法创建和销毁(只能在堆上创建对象)

    class single
    {
    public:
        static single* create()
        {
            return new single;
        }
        static void release(single *p)
        {
            delete p;
        }
    private:
        single(){}
        ~single(){}
    };
    
    int main()
    {
        single *s = single::create();
        single::release(s);
        system("pause");
    }
  • 相关阅读:
    python常用模块之random模块
    python常用模块之time&datetime模块
    on windows in superset sql lab error "module object has no attribute sigalrm"
    Superset安装出错 sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, ...
    Ubuntu16.04怎样安装Python3.6
    Ubuntu16.04切换python3和python2
    Python Set Literals
    odoo 分组视图下显示同一批次记录的总数
    Let's Encryt免费SSL证书申请[我司方案]
    nginx接入let's encrypt
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3942416.html
Copyright © 2020-2023  润新知