One of my friends was facing a problem while trying to write a class B so that no one would be able to inherit from it. He used code as below.
class B; // forward declaration
class Prot // this class is used to stop the inheritance
{
public:
friend class B; // allow only B access to ctors
private:
Prot(){}; // make all ctors private
Prot(const Prot &p){};
};
// class that cannot be inherited from
class B: public Prot // inherit from prot. Since B is friend of Prot it'll work
{
public:
B();
int a;
};
class D : public B
{
public:
int d;
};
D d; // this should fail
However D was still able to inherit from B. What he missed was using virtual inheritance for inheriting from Prot as follows
class B: public virtual Prot // inherit from prot
{
// ...
}
this lead to the bug. Without virtual inheritance the call does not go via the vtable and D is able to access Prot's ctor as it is merged with that of B.
No comments:
Post a Comment