如何检测和断言特定类的虚拟继承?

sha*_*oth 9 c++ inheritance virtual-inheritance visual-c++

我有一个实现引用计数的C++类,我希望这个类的所有用户只能虚拟地继承这个类,这样任何对象都不会有多个引用计数器.

我想在编译时或至少在运行时期间以某种方式断言这个要求.

有没有办法实现这一目标?

Ste*_*sop 9

像这样的东西?

struct RefCounter {
    template <typename T>
    RefCounter(T *) {
        BOOST_STATIC_ASSERT(boost::is_virtual_base_of<RefCounter, T>);
    }
};

struct GoodClass : virtual RefCounter {
    GoodClass() : RefCounter(this) {}
};

struct BadClass : RefCounter {
    BadClass() : RefCounter(this) {}
};
Run Code Online (Sandbox Code Playgroud)

this但是,为了捕获派生类型,需要传递给构造函数是一种遗憾.当然,一个故意迟钝的用户可以通过传递其他东西来破坏它this.


edA*_*a-y 5

我认为包装课程是最简单的选择.而不是直接从RefCounter继承创建中间类.

struct RefCounterVirtPrivate_
{
    int count;

    RefCounterVirt()
        : count( 0 )
    { }
};

struct RefCounter : public virtual RefCounterVirtPrivate_
{
};

struct A : public RefCounter { };
struct B : public RefCounter { };
struct C : public A, public B { };
Run Code Online (Sandbox Code Playgroud)

然后一切都可以继承RefCounter而无需关心虚拟继承.您甚至不必更改任何现有代码 - 虚拟继承RefCounter本身应该是无害的.

这当然不能保证人们不会RefCounterVirtPrivate_直接继承,但这就是为什么我给它一个明显的名字.忘记一个virtual关键字比偶然做到这一点更难.