Use this code to disable inheritance:
class A;class Lock { friend class A;private: Lock() {}};class A : virtual public Lock { // ...public: A() {} A(int t) {}};
Now, if you try to derive any other class from class A, then you’ll receive a compiler error.
class B : public A{}; // Lock::Lock' : cannot access private member declared in class 'Lock'
Here’s the logic behind this: the invocation of a virtual base ctor of a object is the responsibility of the most derived class. Therefore, if you try to derive B from A then the responsibility of invoking the virtual class ctor (i.e. of ctor of Lock is private and class B is not the friend of class Lock.
If you remove the virtual keyword from the derivation list of class A, this program will compile successfully. This is because in non-virtual inheritance, any class can invoke the ctor of only its immediate class. Thus, in the non-virtual inheritance, B would invoke the ctor of its immediate class A and A would invoke the ctor of its immediate class Lock.