sha*_*oth 9 c++ inheritance virtual-inheritance visual-c++
我有一个实现引用计数的C++类,我希望这个类的所有用户只能虚拟地继承这个类,这样任何对象都不会有多个引用计数器.
我想在编译时或至少在运行时期间以某种方式断言这个要求.
有没有办法实现这一目标?
像这样的东西?
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
.
我认为包装课程是最简单的选择.而不是直接从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
关键字比偶然做到这一点更难.