Disable Inheritance

Disable Inheritance

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.


Share the Post: