Is there a way to prevent a class from being derived from twice using a static assert and type trait?

前端 未结 3 1794
北海茫月
北海茫月 2021-01-19 08:10

I realize this is a contrived example, but I want a compile check to prevent this...

class A {};
class B : public A {};
class C : public A {};

class D : pub         


        
相关标签:
3条回答
  • 2021-01-19 08:38

    If you really want to, you an test both your base classes:

    class A {};
    class B : public A {};
    class C : public A {};
    
    class D : public B, public C
    {
        static_assert(!(is_base_of<A,B>::value && is_base_of<A,C>::value),
                       "Invalid inheritance!");
    };
    

    Otherwise you can make the classes inherit virtually from A, so that there will still only be one instance of it in the derived class:

    class A {};
    class B : public virtual A {};
    class C : public virtual A {};
    
    class D : public B, public C
    {
        // only one A here
    };
    
    0 讨论(0)
  • 2021-01-19 08:54

    When I try to derive a class twice as you have here it does not even compile. (duplicate base type)

    0 讨论(0)
  • 2021-01-19 08:57

    The following should work:

    BOOST_STATIC_ASSERT(((A*)(D*)0 == 0)) 
    

    If A exists twice, this should rise an ambiguity error, while otherwise the test will always succeed (because it compares two null pointers).

    0 讨论(0)
提交回复
热议问题